免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: stdlib.h
打印 上一主题 下一主题

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

论坛徽章:
0
31 [报告]
发表于 2005-08-15 13:48 |只看该作者

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

又看了看C-FAQ:
Question 12.26
How can I flush pending input so that a user's typeahead isn't read at the next prompt? Will fflush(stdin) work?

--------------------------------------------------------------------------------

fflush is defined only for output streams. Since its definition of ``flush'' is to complete the writing of buffered characters (not to discard them), discarding unread input would not be an analogous meaning for fflush on input streams.

There is no standard way to discard unread characters from a stdio input stream, nor would such a way be sufficient unread characters can also accumulate in other, OS-level input buffers.

仔细理解了一下:
fflush函数仅仅对于输出流是确定的,由于它对“刷新”的定义是完成缓冲字符的写入(而非丢弃这些字符),在输入流上应用fflush函数也不是意味着抛弃未读取的输入信息。
没有一种标准的方法可以去除来自标准输入流的未读取字符,也可能没有哪种方法能将未读取字符积攒在操作系统级的输入缓冲区中。


其实关于输入问题如何解决,我觉得应该与具体的应用联系起来,根据应用选取合适的方案。也就是说程序员自身把握解决方法的实现过程。

越来越觉得这句话有道理:
``C takes the point of view that the programmer is always right. ''
                           -- Michael DeCorte

论坛徽章:
0
32 [报告]
发表于 2005-08-15 18:23 |只看该作者

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

是不是可以理解为:既然setbuf(stdin,NULL)没能实现重置标准输入为空缓存的功能,所以对于没有证实为对的东西,还是不要使用;免得以后出现莫名其妙的错误;还是老老实实的getchar()吧;
建议对setbuf(stdin,NULL)的问题在精华区做一下说明,不要为后来者产生误导;知识还是要证实是对的之后才可用
stdlib.h 该用户已被删除
33 [报告]
发表于 2005-08-15 21:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

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

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

原帖由 "fsilence" 发表:
是不是可以理解为:既然setbuf(stdin,NULL)没能实现重置标准输入为空缓存的功能,所以对于没有证实为对的东西,还是不要使用;免得以后出现莫名其妙的错误;还是老老实实的getchar()吧;
建议对setbuf(stdin,NULL)?.........


这样理解是不对的。
setbuf(stdin, NULL)和fflush(stdin)是不一样的。
1、fflush()是完成写入,而fflush(stdin)未定义是因为它没有完成写入的对象(fflush(stdout)可以将未读取的内容直接写到终端屏幕,可是fflush(stdin)往哪里写呢?)。
2、而setbuf(stdin, NULL)等效于setvbuf(stream, buf, _IONBF, BUFSIZ)它是设置stdin为无缓冲类型,也就是不接受多余的内容。也就不存在要刷新缓冲区或丢弃未读字符等问题了。

所以,setbuf(stdin, NULL)是可以用的,只不过效率较低。

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

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

可是如果setbuf(stdin,NULL)就是设置stdin为空缓存模式,那么为什么只设一次时没有成功,只有每次setbuf(stdin,NULL)才好用,难道还能说setbuf(stdin,NULL)是好用的吗?
这样理解是不对的。
setbuf(stdin, NULL)和fflush(stdin)是不一样的。

我从来没说过setbuf(stdin, NULL)和fflush(stdin)是一样的

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

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

1、fflush()是完成写入,而fflush(stdin)未定义是因为它没有完成写入的对象(fflush(stdout)可以将未读取的内容直接写到终端屏幕,可是fflush(stdin)往哪里写呢?)。



这个是我想到的 不知道对不?
fseek应该行的啊。到末尾,可是我没有实验,刚才那位朋友说不行

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

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

楼上的朋友,那为什么不试试呢,大家对照一下结果。我试的结果是fseek返回-1
我记得以前看哪本书上也写的是fseek对标准输入流无效。

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

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

可是如果setbuf(stdin,NULL)就是设置stdin为空缓存模式,那么为什么只设一次时没有成功,只有每次setbuf(stdin,NULL)才好用,难道还能说setbuf(stdin,NULL)是好用的吗?



谢谢fsilence兄的建议。问题之大,已无法修补。
sebuf(stdin,NULL)确实存在问题,我从comp.lang.c上得到了答案。
大家可以去看一看
http://groups-beta.google.com/gr ... 1051c26299b4c?hl=en
中Walter Roberson的精彩发言。
由于都是英文,我正在消化中。等一阵子我把它翻译出来在分享给各位朋友。

为不误人子弟,恳请版主删掉精华贴中的《关于流和缓冲区的理解以及一般标准输入问题的解决方法小结 》一篇,里面存在很大的问题,待我修缮后再发上来。

论坛徽章:
0
39 [报告]
发表于 2011-11-28 16:05 |只看该作者
就是都没有清除缓存的方法?只是能够设置为无缓存方式?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP