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