博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux c fprintf()
阅读量:4556 次
发布时间:2019-06-08

本文共 1244 字,大约阅读时间需要 4 分钟。

#include
#include
#include
int main(int argc,char *argv[]){ FILE *fp; time_t t; if(argc < 2) { printf("Usage: %s
\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也可以成功运行程序。

转载于:https://www.cnblogs.com/jiaan/p/9260297.html

你可能感兴趣的文章
Exp6 信息搜集与漏洞扫描
查看>>
redis4安装
查看>>
使用命令wsimport构建WebService客户端[转]
查看>>
第八遍:链接详解
查看>>
Qt5.5 使用smtp发邮件的各种坑
查看>>
js奇葩错误 字符串传递问题
查看>>
人之初,性本恶
查看>>
springboot 端口号
查看>>
使用AChartEngine画动态曲线图
查看>>
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>