声明:这篇笔记是我去年写的,当时参考了网友的博客,现在想不起来是哪篇了。如有侵权请告知,我会及时修改,谢谢。
“Talk is cheap, show me the code",so,先来一个例子吧。
#include<stdio.h>
int main(void)
{
int i;
for(i=1 ; i <= 1024 ; i++)
{
printf("%c",'a');
}
while(1);
return 0;
}
编译并运行该程序,发现并没有任何输出。printf("%c",'a');这句话难道没有执行吗,打印的a去哪儿了啊?别着急,把上述代码段中的1024改为1025,运行后,程序输出了一大串a。为什么呢?
执行完for(i=1 ; i <= 1024 ; i++)这一句时,程序没有输出任何数据,因为系统把1024个字符写进输出缓冲区,缓冲区刚好写满,但是没有换行符'\n',数据躺在了缓冲区里,并没有被送到标准输出,所以没有在屏幕上打印任何数据;
执行完for(i=1 ; i <= 1025 ; i++)这一句时,程序输出了1024个字符,因为当把第1025个字符放进缓冲区的时候,缓冲区恰好满了,把前面的1024个字符从缓冲区"挤"到了标准输出,即打印到了屏幕上。此时,第1025个字符孤零零的躺在了缓冲区。数据在缓冲区是“前赴后继”的。
以下是我对文件缓冲机制的总结:
1.对文件的操作有带缓冲区和不带缓冲区之分,带缓冲区的分为全缓冲和行缓冲。
2.对文件的读写为什么要使用缓冲机制?
如果没有缓冲区,每当进行文件的读写操作时,都会调用一次系统调用,从进程空间切换到内核空间,程序会进行上下文的切换,会浪费时间。如果对文件的操作比较频繁,则会大大降低对文件操作的效率。
3.什么是全缓冲?
全缓冲,就是当数据填满整个缓冲区时,才会执行读写的系统调用,典型值为8192个字节。
4.什么是行缓冲?
当遇到换行符或者填满整个行时,才会执行读写的系统调用,典型值为1024个字节。
5.还有哪些方式可以将缓冲区的数据同步到磁盘文件?
fclose(fp),在关闭文件之前,会把缓冲区的数据同步到磁盘文件;
fflush(fp),强制刷新缓冲区。
综上所述:执行文件的写操作之后,不能保证把数据成功的,及时的写入到指定的文件,因为系统只是将数据暂时写入了文件缓冲区!