$cat 12345.txtabcde这个结果很让我奇怪,我本来以为我设置了一个20长度的行缓冲区,但是我只是输出6个字符,没有填满缓冲区,所以不应该有输出到文件,但是没想到,在sleep的时候去cat文件,发现内容已经写到了文件中,说明行缓冲区已经被填满。。。我很疑惑,然后我尝试把行缓冲区的大小扩大到200
#include <stdio.h>main(){ char * str = "abcde"; char * buf = (char *)malloc(200); FILE * fp = fopen("12345.txt", "w"); setvbuf(fp, buf, _IOLBF, 200); fwrite(str, sizeof(char), strlen(str), fp); sleep(100);}
$cat 12345.txt没有内容。扩大了行缓冲区后,这次没有内容输出到文件。所以我猜想内核肯定也会利用这个缓冲区做一些事情,而不只是单单把要输出的内容放进去,所以如果这个行缓冲区的大小比较小的话,虽然看起来能容纳下要输出的内容,但是很可能已经被系统内核的一些信息占了一些空间,所以有一点点输出也许就填满了缓冲区,从而就刷新到了文件里。不知道我这个理解对不对????
#include <stdio.h>main(){ char * str = "abc\nde"; //在要输出的字符串中间加上换行符,强制刷新缓冲区 char * buf = (char *)malloc(200); FILE * fp = fopen("12345.txt", "w"); setvbuf(fp, buf, _IOLBF, 200); fwrite(str, sizeof(char), strlen(str), fp); sleep(100);} $cat 12345.txt abc 可以看到,换行符之前的字符串已经输出了,后面的还在缓冲区里没有输出的文件。另外让程序自行结束后, $cat 12345.txt abc de 可以看到,剩下在缓冲区的内容,在程序退出时候,标准I/O库会自动关闭此流并刷新缓冲区。 <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 阅读(192) | 评论(0) | 转发(0) | 0上一篇:可变参数va_list的理解和使用
下一篇:leetcode(2)
相关热门文章 test123编写安全代码——小心有符号数...使用openssl api进行加密解密...一段自己打印自己的c程序...彻底搞定C语言指针详解-完整版... 给主人留下些什么吧!~~ 评论热议