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 回答