#include<stdio.h>
#include<unistd.h>
#include<time.h>
int main(int argc,char *argv[])
{
       FILE  *fp;
       time_t t;
       if(argc < 2)
       {
             printf("Usage: %s<file>\n",argv[0]);
             return -1;
        }  
        if((fp = fopen(argv[1],"w")) == NULL)
         {
            perror("fail to fopen");
            return -1;  
         }
        while(1){
               time(&t);
               fprintf(fp,"%s",ctime(&t));
               sleep(1);
        }  
       fclose(fp);
       fp = NULL;  
       return 0;
}

  作者在  gcc time_3.c -o time_3 

           ./time_3  1.txt 

之后,并没有在1.txt中查看到数据。经过一番搜查后知道了,数据先是存在缓存中,有缓存刷新时,才能从缓存中读出数据写到文件中,然而fprintf()自己读完一行数据后并不能自己刷缓存,需要在sleep(1)上一行加  fflush(fp);就可以刷新缓存,程序就可以编译运行成功了。经查,1.txt中出现了期待已久的数据。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2018.7.21补:

经阅读UNIX环境高级编程 第118页,找到了上面问题的答案。

标准IO提供缓冲机制以减少函数调用次数。

标准IO提供了3中类型的缓冲:1.全缓冲,2.行缓冲,3.不带缓冲。闻名思意,达到了这些缓冲类型的要求,才会将内容送入内核,写入流中,可以用setvbuf(...)函数设置缓冲类型。

上述代码中在系统中运行时,系统用的是全缓冲,故,不会将数据写入流,将缓冲类型改为行缓冲之后(在定义流后改),不用fflush也可以成功运行程序。

posted on 2018-07-03 19:41  子都  阅读(472)  评论(0编辑  收藏  举报