zoukankan      html  css  js  c++  java
  • linux c fprintf()

    #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>
    ",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也可以成功运行程序。

  • 相关阅读:
    力扣算法:组合总和IV
    力扣算法:组合总和III
    逻辑回归(Logistic Regression)学习笔记
    力扣算法:组合总和II
    力扣算法:组合总和
    寒假作业(五)
    寒假作业(四)
    寒假作业(三)
    寒假作业(二)
    寒假学习(一)
  • 原文地址:https://www.cnblogs.com/jiaan/p/9260297.html
Copyright © 2011-2022 走看看