2017-11-15 12 views
2

バイナリファイルを開くC++コードを書く必要があり、5 MBの '1'を書き込む。特定のサイズのファイルにconstパターンを書き込む

は現在、私のコードは次のとおりです。

#define BYTES_BUFFER_SIZE_5MB (1024*1024*5) 

static char buffer[BYTES_BUFFER_SIZE_5MB]; 
memset(buffer, 0xff, BYTES_BUFFER_SIZE_5MB); 
ofstream myFile ("data.bin", ios::out | ios::binary); 
myFile.write(buffer, BYTES_BUFFER_SIZE_5MB); 

ファイルに書き込むためmemset様方法がありますので、私はバッファを避けることができますか?

+2

'1024 * 1024 * 5' =あなたが16ビットの' int'を持っていればメリー。コンパイル時に評価可能な定数式には非常に注意する必要があります。 – Bathsheba

+0

大きなバッファを使用する優れた点は、システムがバックグラウンドでデータ転送を処理できることです。たとえば、ドライバはDMAプロセッサを使用してデータをハードドライブに転送できます。 CPUはメモリを読み込み、デバイスにデータを書き込んだり、繰り返したりする必要がありません。 –

+0

各トランザクションにオーバーヘッドがあります。最適なソリューションは、トランザクションごとのデータサイズを最大化することです。オーバーヘッドは、ドライブスピンアップ、スピンダウンドライブ、セクターの特定などです。 –

答えて

1

小さいバッファを使用して、ループをforループで数回書くことができます。

あなたは5Mbの記述する必要があります場合は、write()方法が本当に遅くなる可能性が

#define BYTES_SIZE_5MB (5242880) // Bathsheba comment have to be considered 
#define BUFFER_SIZE (1024) // Chunk size to be written (this is an arbitrary amount) 

static char buffer[BUFFER_SIZE]; 
ofstream myFile ("data.bin", ios::out | ios::binary); 
int i, repetitions = BYTES_SIZE_5MB/BUFFER_SIZE; 
memset(buffer, 0xff, BUFFER_SIZE); 
for (i=0; i < repetitions; ++i) 
    myFile.write(buffer, BYTES_BUFFER_SIZE_5MB); 
myFile.close(); 

ノートのようなものは、それが大きなチャンクサイズ、あなたがwrite以下を行いますその方法を選択する方が良いでしょう行うことができます呼び出しの速度が向上します。

0

これは単純ではありませんが、memory-mapped filesを使用できます。彼らはあなたが求めたものを正確に与えます。あなたがメモリに書き込んでいるかのようにファイルを書くことができます。

オペレーティングシステムごとに異なるAPIがありますが、移植性の高いサポートを提供するライブラリはいくつかあります。

私たちは、ストリームマニピュレータと1行でこれを行うことができると思い
1

:それはデフォルト では0xFFを書き出す作るために

  • setfillを書き出すバイト数を設定する

    fout << std::setw(BYTES_BUFFER_SIZE_5MB - 1) << std::setfill(char(0xFF)) << char(0xFF); 
    

    私たちにはバッファが含まれていません。唯一のリスクは、多くのバイトを書きたい場合、setwへの呼び出しでintがオーバーフローするリスクがあることです。

  • 関連する問題