免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14565 | 回复: 12
打印 上一主题 下一主题

fflush可有可无吗? [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-11 17:42 |只看该作者 |倒序浏览
如下代码,把fflush注释掉,为何结果一样。
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     char user[100];
  5.     char oldpasswd[100];
  6.     char newpasswd[100];
  7.     printf("User name: ");
  8.     //fflush(stdout);
  9.     gets(user);

  10.     printf("Old password: ");
  11.     //fflush(stdout);
  12.     gets(oldpasswd);

  13.     printf("New password: ");
  14.     //fflush(stdout);
  15.     gets(newpasswd);


  16.     printf("---\n%s\n%s\n%s\n",user,oldpasswd,newpasswd);

  17. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-06-11 17:47 |只看该作者
你把输出改成对磁盘文件,输出完成sleep(100)暂停程序,观察有fflush和没有时的文件字节数,会比较明显。

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2015-12-14 17:57:31
3 [报告]
发表于 2010-06-11 17:48 |只看该作者
受教了

论坛徽章:
0
4 [报告]
发表于 2010-06-11 21:21 |只看该作者
本帖最后由 16887126 于 2010-06-11 21:53 编辑

printf是行缓存,没加换行符\n,为什么也会输出?
是不是从标准输入读取字符,例如fgets,gets,scanf,都会导致标准输出flush?

论坛徽章:
0
5 [报告]
发表于 2010-06-11 21:52 |只看该作者
Windows下是要输出的。

论坛徽章:
0
6 [报告]
发表于 2010-06-13 02:36 |只看该作者
期待高手给讲解一下阿~~研究了很长时间没得出什么结论~~

论坛徽章:
0
7 [报告]
发表于 2010-06-13 08:54 |只看该作者
fflush(fp)就是同步fp在缓存中的数据到fp指向的文件,如果不执行fflush,缓存和文件中的内容会有一些不一致,但是fclose(fp)后,缓存中的数据都会同步到文件中的,所以如果没有严格要求,是不需要执行fflush的,其肯定是影响效率的

论坛徽章:
0
8 [报告]
发表于 2010-06-13 11:34 |只看该作者
楼住,运行下面的代码
#include<stdio.h>
#include <unistd.h>
int main()
{
     char user[100];
     char oldpasswd[100];
     char newpasswd[100];
     printf("User name:");
     //fflush(stdout);
     //gets(user);
     sleep(2);
     printf("Old password:");
     //fflush(stdout);
     //gets(oldpasswd);
     sleep(2);

     printf("New password:");
      //fflush(stdout);
     //gets(newpasswd);
     sleep(2);

     //printf("---\n%s\t%s\t%s\t",user,oldpasswd,newpasswd);


}
可以看出不能没有fflush(),最后得出结论好像是因为gets()的原因吧~可能是因为调用gets()用到终端,所以先把与终端关联的文件(stdin,stderr,stdout)先冲刷一下。程序在退出的时候先冲刷缓冲区,所以会有最后的输出。各人愚见阿~~忘高人指点一下

论坛徽章:
0
9 [报告]
发表于 2010-06-13 16:24 |只看该作者
printf是行缓存,没加换行符\n,为什么也会输出?
是不是从标准输入读取字符,例如fgets,gets,scanf,都 ...
16887126 发表于 2010-06-11 21:21



    没错,根据APUE2的解释,当需要通过行缓冲流从内核得到输入数据时,都会导致输出行缓冲流被刷新。

论坛徽章:
0
10 [报告]
发表于 2010-06-13 16:32 |只看该作者
不过这里要强调的是“从内核”得到数据才会导致输出行缓冲流被刷新,如果输入行缓冲流内已经缓冲有数据,则不会导致输出行缓冲流被刷新。
实验一下,在printf()前加一个scanf("%c", &i),然后运行到这要求输入的时候,输入多于一个字符,再加上一个空格,比如abc ,回车,则此时因为行缓冲区余下有数据(a被scanf()取走后,输入行缓冲流内还存在着bc,空格和'\n'),gets直接从行缓冲区取得数据(bc和空格),不需要向内核请求系统调用,则不会导致输出行缓冲流被刷新。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP