免费注册 查看新帖 |

Chinaunix

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

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问! [复制链接]

stdlib.h 该用户已被删除
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-12 12:42 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
2 [报告]
发表于 2005-08-12 14:39 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

关于这个精华帖,我也说一下我的疑问

  1. #include <stdio.h>;

  2. int main(void)
  3. {
  4.   int i,j;
  5.   char c;
  6.   printf("\n do you want to cal:y/n \n");

  7.   while (c=getchar()=='y')
  8.   {
  9.       printf("input number:");
  10.       scanf("%d%d",&i,&j);
  11.       printf("i*j=%d",i*j);
  12.       setbuf(stdin, NULL);
  13.       printf("\n do you want to cal:y/n \n");
  14.   }
  15. /*system("pause");*/
  16.   return 0;
  17. }
复制代码

和程序段

  1. #include <stdio.h>;

  2. int main(void)
  3. {
  4.   int i,j;
  5.   char c;
  6.   printf("\n do you want to cal:y/n \n");
  7.   setbuf(stdin,NULL);

  8.   while (c=getchar()=='y')
  9.   {
  10.       printf("input number:");
  11.       scanf("%d%d",&i,&j);
  12.       printf("i*j=%d",i*j);
  13.       //setbuf(stdin, NULL);
  14.       printf("\n do you want to cal:y/n \n");
  15.   }
  16. /*system("pause");*/
  17.   return 0;
  18. }
复制代码

的效果是不是应该是一样的?
下面改动后的程序就不能治疗getchar()读到换行符的问题

论坛徽章:
0
3 [报告]
发表于 2005-08-12 15:19 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

To stdlib.h: 我做测试的结果。gcc4, fedora4
97 10  0  0  0  0  0  0  0  0

To fsilence:
放到循环外,只清空了一次输入缓冲区。
循环内,每次重新输入前都清空。效果当然不一样。

while (c=getchar()=='y')这里,估计这不是你想要的
可能应当改成while ((c = getchar()) == 'y')
注意优先级。

论坛徽章:
0
4 [报告]
发表于 2005-08-12 16:16 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

我贴的是转自精华帖的源码,没有注意优先级的问题,虽然那样写不好不规范,但是应该也没有错。
还有setbuf(stdin,NULL),含义是

1。每次调用时清空stdin缓存
还是
2。调用之后就能设置输入流没有缓存,为空缓存机制

论坛徽章:
0
5 [报告]
发表于 2005-08-12 16:27 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

如果每次都要setbuf(stdin,NULL)才好用的话,那与getchar()一下那个换行符,也没什么本质区别
stdlib.h 该用户已被删除
6 [报告]
发表于 2005-08-12 16:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2005-08-12 17:01 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

有三种类型的缓冲策略,它们是无缓冲,块缓冲和行缓冲。当输出流无缓冲时,信息在写的同时出现于目标文件或终端
       上;当是块缓冲时,字符被暂存,然后一起写入;当是行缓冲时,字符被暂存,直到要输出一个新行符,或者从任何与
       终 端 设 备 连 接 的 流 中 (典型的是 stdin) 读取输入时才输出。函数 fflush(3) 可以用来强制提前输出。(参见
       fclose(3)) 通常所有文件都是块缓冲的。当文件 I/O 操作在文件上发生时,将调用 malloc(3) ,获得一个缓冲。 如
       果流指向一个终端 (通常 stdout 都是这样),那么它是行缓冲的。标准错误流 stderr 默认总是无缓冲的。

       函数 setvbuf 可以用在任何打开的流上,改变它的缓冲。参数 mode 必须是下列三个宏之一:

              _IONBF 无缓冲

              _IOLBF 行缓冲

              _IOFBF 完全缓冲

       除 非是无缓冲的文件,否则参数 buf 应当指向一个长度至少为 size 字节的缓冲;这个缓冲将取代当前的缓冲。如果
       参数 buf 是 NULL ,只有这个模式会受到影响;下次 read 或 write 操作还将分配一个新的缓冲。函数 setvbuf  只
       能在打开一个流,还未对它进行任何其他操作之前使用。

       其他三个函数调用是函数 setvbuf 的别名,函数 setbuf 与使用下列语句完全等价:

              setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

       函 数 setbuffer 与此相同,但是缓冲的长度由用户决定,而不是由默认值 BUFSIZ 决定。函数 setlinebuf 与使用下
       列语句完全等价:

              setvbuf(stream, (char *)NULL, _IOLBF, 0);

个人认为,应当调用的是fflush(stdin)而不是setbuf;

论坛徽章:
0
8 [报告]
发表于 2005-08-12 17:13 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

首先,不能用fflush,fflush只能对用户缓冲区而且是写缓冲进行刷新,
man fflush的结果:
The  function  fflush forces a write of all user-space buffered data for the given  output or update stream via the stream's underlying write function.
关于我的那个疑问,希望大家能仔细看看;希望大家对精华帖的对换行符的"治本"处理的那部分仔细考证一下,记住一个错误的知识点就不好了

To:楼主
   我在RH7.3,gcc 2.96上试,输出是一个10,不是两个10,跟renstone921的结果一样,怀疑是windows系统跟linux系统的机制哪里不一样。

论坛徽章:
0
9 [报告]
发表于 2005-08-12 17:17 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

然后,我把c=getchar()改成了scanf("%d",&i);
   运行后输入一个数,如15,回车!嗯?没反应,光标往下移了一行!我再输入一个数或者字符如'a',再回车,程序才接着往下走,打印出如下结果:
  97 10 10 10 0 0 0 0 0 0
  over
  这下我就更糊涂了,为什么要输入两次才有反应?那个15跑哪去了?缓冲区中为什么会有三个换行符?
我又试着这样运行:输入15 25再回车,马上就有结果了:
49 53 32 50 53 10 10 0 0 0
  over
分别对应着每一个输入字符的ASC码!

关于输出的是每个输入字符的ASCII码,这个倒很正常,因为我们从键盘上敲入的本来就是ASCII码,只是scanf这个函数对这些ASCII数字做了处理,能做特定的类型转换;你如果把这个输入流输出的话,肯定还是ASCII码的

论坛徽章:
0
10 [报告]
发表于 2005-08-12 17:30 |只看该作者

看了精华区kenelxu关于缓冲区的那篇文章,仍有以下疑问!

我现在的看法是:
从man的输出看,setbuf(stdin,NULL)是设置标准输入无缓存;
但从程序结果来看,setbuf貌似只是清空缓存流;
所以让我很疑惑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP