文件缓冲区测试实例及总结

来源:互联网 发布:java kafka producer 编辑:程序博客网 时间:2024/05/16 07:38

声明:这篇笔记是我去年写的,当时参考了网友的博客,现在想不起来是哪篇了。如有侵权请告知,我会及时修改,谢谢。

  “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),强制刷新缓冲区。

  综上所述:执行文件的写操作之后,不能保证把数据成功的,及时的写入到指定的文件,因为系统只是将数据暂时写入了文件缓冲区!



  

0 0