我对获得的磁盘速度感到有点惊讶..我似乎能够在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确保数据实际写在硬盘上......?
答案 0 :(得分:9)
用于写入文件的标准库函数只管理自己的内部缓冲区。在现代操作系统中写入文件时,即使在fclose
数据实际进入操作系统的缓冲区之后,也会延迟写入,直到它认为这是一个好时机。
确保将数据写入磁盘的常用方法是发出特定于操作系统的调用以强制写入磁盘;在POSIX上它是fsync
/ sync
,在Windows上你想要FlushFileBuffers
。
答案 1 :(得分:7)
fclose只刷新C库缓冲区,系统缓冲区不会被刷新。因此,您需要系统调用,如(f)同步。
答案 2 :(得分:0)
fclose()也会清除流的缓冲区缓存,所以当你调用fclose()时,将清除未读缓冲区的内容。