1.
flush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
2.
fflush的真正作用就是立即将缓冲区中的内容输出到设备。正因为这样,所以只能在写入文件的时候使用fflush。在读取文件时使用fflush是不好的编程方法,因为那样的代码在一些环境下可能正常工作,但在另一些环境下则会出错,这导致程序不可移植。
flush即清空缓冲,在慢速设备上使用缓存是一种提升数据处理效率的手段,flush的作用是将内存中缓冲的内容实际写入外存媒介
详见MSDN的Kernel32!FlushFileBuffers
fclose后未必会flush一次的,操作系统会在CPU空闲的时候执行flush
3.
fflush不应该在读取文件的时候用,而应该在写入文件的时候用。fflush会清空缓冲区,fclose在关闭文件之前也会清空缓冲区。如果使用exit函数退出程序,或者main函数返回,则所有打开后没有关闭的文件会自动关闭,关闭时也会清空缓冲区。
通常,只有在程序非正常结束的情况下,缓冲区才不会被清除。
FILE* pFile;
int* p = NULL;
pFile = fopen("out.txt", "w");
fprintf(pFile, "%s", "hello");
*p = 10; // 在这里,程序会出错,然后退出
// 此时hello几个字符很可能还在缓冲区中,而没有实际的输出到设备
// 所以文件中很可能没有数据
int* p = NULL;
pFile = fopen("out.txt", "w");
fprintf(pFile, "%s", "hello");
*p = 10; // 在这里,程序会出错,然后退出
// 此时hello几个字符很可能还在缓冲区中,而没有实际的输出到设备
// 所以文件中很可能没有数据
如果在fprintf一句后面加上fflush(pFile);则即使以后程序出错,因为数据已经写入,所以文件中一定会有数据存在。
fflush的真正作用就是立即将缓冲区中的内容输出到设备。正因为这样,所以只能在写入文件的时候使用fflush。在读取文件时使用fflush是不好的编程方法,因为那样的代码在一些环境下可能正常工作,但在另一些环境下则会出错,这导致程序不可移植。