私はC++には新しく、たくさんのputcを使用してファイルである出力にデータを書き込むアプリケーションを作っています。私はDelphiでコードを作成していましたので、解決する方法を知っています。メモリストリームを作成し、出力に書き込む必要があるたびに書き込みを行い、メモリストリームのサイズが大きければ私たちが望むバッファサイズよりも小さく、出力に書き込み、メモリストリームをクリアします。 C++やその他の優れたソリューションでこれをどうすればいいですか?putcのバッファリングwrite
答えて
ファイルへの書き込みはすばやく行う必要があります。通常はバッファを空にするのに時間がかかります。 std::endl
の代わりに\n
という文字を使用することを検討してください。
ここにどれくらい書いているのですか?IO Write:497 MB(127406書込み)とバイナリデータを書いています。 – Joruun
あまり時間がかかりません。手動でバッファをフラッシュしない場合、速度はディスクの最大読み取り速度に近づくはずです。あなたが本当に立ち往生したら、すべてをstd :: stream(バッファフラッシュを自動的にスキップするはずです)に入れてから、ストリームをファイルにフラッシュしてみてください。 –
良い説明といくつかのマイクロベンチマークがあります:https://www.youtube.com/watch?v=GMqQOEZYVJQ –
私はあなたの質問に良い答えはここにあると思う: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要求。
「unsigned long long」とは何ですか? – spectras
最大の正の整数が必要です(intではない) – imoutidi
何のために?書き込みサイズについて話しているなら、その目的のための型 'size_t'があります。これはC言語のC99標準で定義されています(C++のどちらを覚えていないか)、メモリに収まる任意のオブジェクトのサイズを保持できることが保証されています。 'stddef.h'(レガシー)から' :: size_t'、または 'cstddef'ヘッダ(現在)から' std :: size_t'のいずれかを取得します。それらは必ずしも同じではありません。 – spectras
PUTCがすでにバッファされ、4キロバイトでは、その値を変更するためにはsetvbufを使用することができ、デフォルトである:D
- 1. write on write with shared_ptr
- 2. バッファリングされていないread()/ write()操作でバッファキャッシュが使用されるのはなぜですか?
- 3. Oracleデータのバッファリング
- 4. M2Mqttメッセージのバッファリング
- 5. IHTMLDocument2.write()
- 6. SYSFUNCTとPUTCまたはPUTNの使い方
- 7. MPMoviePlayerControllerのバッファリング状態
- 8. データのバッファリング/ストレージ - Python
- 9. Haskellのデフォルトioバッファリング
- 10. ストリーミングとビデオのバッファリング
- 11. Write-HostとWrite-OutputのPowerShellの違いは?
- 12. バッファリングGridview android
- 13. AWS Firehoseバッファリング
- 14. AVPlayerバッファリング率
- 15. Android VideoViewバッファリング
- 16. Filebeatとバッファリング
- 17. ルビーIO.popen STDOUTバッファリング
- 18. vxWorksパラレルポートwrite()エラー
- 19. ApacheビームPubSubIO write
- 20. Q_PROPERTY:MEMBER対READ/WRITE
- 21. Spark Python CSV Write
- 22. Firebase Child Read/Write
- 23. Cassandra:read/s write/s
- 24. Netty ChannelOutboundHandlerAdapter write
- 25. Android SharedPreference write =値
- 26. writeシステムコールがNUL
- 27. Hibernate Delayed Write
- 28. universal .htaccess to write
- 29. android socket write error
- 30. Java Bulk WRITE
は '' putc''はなく、既にバッファリングIを使用するための具体的な理由があります/ O関数(広範な関数:STLストリーム、printf、...)? – nefas
そのビットプロセッサなのでputcは私にとって最も速いオプションと思われました – Joruun
これは[fwrite already buffered]です(https://stackoverflow.com/questions/2806104/does-fwrite-buffer-the-output ) – Sniper