3

私が得ているディスク速度には少し驚いています..1秒未満で1GBのファイルを書き込むことができるようです..

size_t s = 1*1024*1024;
char* c = new char[s];
FILE* fx = fopen("D:\\test.mine", "wb");
//ensure(fx);
for(int i = 0; i < 1024; ++i)
{
    fwrite(c,1,s,fx);
}
fclose(fx);
delete[] c;

何がこれを引き起こしたのか理解するのが少し難しいですか?fclose は、データが実際にハードディスクに書き込まれていることを保証していると思いました...?

4

3 に答える 3

9

ファイルに書き込むための標準ライブラリ関数は、独自の内部バッファーを管理するだけです。最新のオペレーティング システムでファイルに書き込む場合fclose、データが実際にオペレーティング システムのバッファに入った後でも、適切なタイミングであると判断されるまで書き込みが遅延します。

データが確実にディスクに書き込まれるようにする通常の方法は、オペレーティング システム固有の呼び出しを発行して強制的にディスクに書き込むことです。POSIX ではfsync/syncで、Windows では必要ですFlushFileBuffers

于 2012-08-22T13:20:32.393 に答える
7

fclose は C ライブラリ バッファのみをフラッシュし、システム バッファはフラッシュしません。そのため、(f)sync のようなシステム コールが必要です。

于 2012-08-22T13:20:38.397 に答える
0

fclose() はストリームのバッファ キャッシュもクリアするため、fclose() を呼び出した瞬間に未読バッファの内容は消去されます。

于 2012-08-22T13:23:07.930 に答える