2017-05-22 16 views
0

私はC++には新しく、たくさんのputcを使用してファイルである出力にデータを書き込むアプリケーションを作っています。私はDelphiでコードを作成していましたので、解決する方法を知っています。メモリストリームを作成し、出力に書き込む必要があるたびに書き込みを行い、メモリストリームのサイズが大きければ私たちが望むバッファサイズよりも小さく、出力に書き込み、メモリストリームをクリアします。 C++やその他の優れたソリューションでこれをどうすればいいですか?putcのバッファリングwrite

+2

は '' putc''はなく、既にバッファリングIを使用するための具体的な理由があります/ O関数(広範な関数:STLストリーム、printf、...)? – nefas

+0

そのビットプロセッサなのでputcは私にとって最も速いオプションと思われました – Joruun

+0

これは[fwrite already buffered]です(https://stackoverflow.com/questions/2806104/does-fwrite-buffer-the-output ) – Sniper

答えて

0

ファイルへの書き込みはすばやく行う必要があります。通常はバッファを空にするのに時間がかかります。 std::endlの代わりに\nという文字を使用することを検討してください。

+0

ここにどれくらい書いているのですか?IO Write:497 MB(127406書込み)とバイナリデータを書いています。 – Joruun

+0

あまり時間がかかりません。手動でバッファをフラッシュしない場合、速度はディスクの最大読み取り速度に近づくはずです。あなたが本当に立ち往生したら、すべてをstd :: stream(バッファフラッシュを自動的にスキップするはずです)に入れてから、ストリームをファイルにフラッシュしてみてください。 –

+0

良い説明といくつかのマイクロベンチマークがあります:https://www.youtube.com/watch?v=GMqQOEZYVJQ –

0

私はあなたの質問に良い答えはここにあると思う:Writing a binary file in C++ very fast

答えはどこに:

#include <stdio.h> 
const unsigned long long size = 8ULL*1024ULL*1024ULL; 
unsigned long long a[size]; 

int main() 
{ 
    FILE* pFile; 
    pFile = fopen("file.binary", "wb"); 
    for (unsigned long long j = 0; j < 1024; ++j){ 
     //Some calculations to fill a[] 
     fwrite(a, 1, size*sizeof(unsigned long long), pFile); 
    } 
    fclose(pFile); 
    return 0; 
} 

あなたのケースで最も重要なことはして、あなたができる限り多くのデータを書き込むことです少なくとも可能なI/O要求。

+0

「unsigned long long」とは何ですか? – spectras

+0

最大の正の整数が必要です(intではない) – imoutidi

+1

何のために?書き込みサイズについて話しているなら、その目的のための型 'size_t'があります。これはC言語のC99標準で定義されています(C++のどちらを覚えていないか)、メモリに収まる任意のオブジェクトのサイズを保持できることが保証されています。 'stddef.h'(レガシー)から' :: size_t'、または 'cstddef'ヘッダ(現在)から' std :: size_t'のいずれかを取得します。それらは必ずしも同じではありません。 – spectras

1

PUTCがすでにバッファされ、4キロバイトでは、その値を変更するためにはsetvbufを使用することができ、デフォルトである:D

setvbuf