| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1430 人关注过本帖
标题:输入流的困惑
只看楼主 加入收藏
yhtian619
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2010-2-5
结帖率:0
收藏
已结贴  问题点数:20 回复次数:12 
输入流的困惑
程序如下:
#include <iostream>
using namespace std ;

int main()
{
    int ival ;
    while(cin >> ival, !cin.eof())
    {
        if(cin.bad())
            throw runtime_error(" IO stream corrupted ") ;
        if(cin.fail())
        {
            cerr << " bad data, try again " ;
            cin.clear(istream::failbit);
            continue ;
        }
    }
    return 0 ;
}
输入如果是int型数据程序当然没有问题了,但如果输入其他的,比如char型,程序就会无限循环了,不断输出bad data,try again ,输入流并没有等待我输入数据。各位大虾,请问是怎么回事啊?是输入缓冲区的问题嘛?
搜索更多相关主题的帖子: 输入 困惑 
2010-02-07 22:11
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:4 
while(cin >> ival)
你为什么不这样呢?说说你的想法!!
2010-02-08 19:48
_DaNciNg_
Rank: 2
等 级:论坛游民
帖 子:81
专家分:28
注 册:2009-3-30
收藏
得分:4 
想知道while循环中可以用逗号吗
表示的是什么意思
小弟惭愧,没有见过。
2010-02-08 19:59
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:4 
由于读一个 int 失败,所以你输的那个 char 根本没有读进来。所以下回再读还是 fail。
2010-02-08 22:38
ly861014
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:177
注 册:2008-10-28
收藏
得分:4 
回复 4楼 pangding
cin.clear(istream::failbit);之后,流又恢复有效状态了,下回读之前应该不是fail吧?
我感觉这段代码是有些问题,按理说不应该是无限循环。
2010-02-09 15:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我说的可能不清楚。
不是说 fail 没清回来。而是你清了之后转回来读的是什么?还是阻塞在那里的那个 char ,当发生读错误的时候,cin 是不可能把输入流清空的,没读的还是在那里。但你还是想当 int 读,能读吗?还得 fail。
2010-02-09 17:16
ly861014
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:66
专家分:177
注 册:2008-10-28
收藏
得分:0 
回复 6楼 pangding
不大明白为什么读入的时候,cin不能清空流啊?为什么用清空这个词呢?
2010-02-09 20:22
yhtian619
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2010-2-5
收藏
得分:0 
回复 楼主 yhtian619
首先,while循环里是个逗号表达式,其真假依赖于!cin.eof()的真假。如果直接用while( cin >> val ),且读入char型数据的话,输入流马上失效,循环就会结束,根本没法保证val有初值。第二,!cin.eof()判断是否到了文件结尾,跟流的有效和无效应该没有什么关系的吧,但什么时候代表文件结尾我暂时还不清楚。
2010-02-09 20:43
yhtian619
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2010-2-5
收藏
得分:0 
回复 4楼 pangding
也就是说如果输入缓冲区还有数据没读走,就算把输入流恢复为有效,还是会先读之前的数据,所以才会不等待用户输入数据就直接跳过了?那有没有办法在下次读入之前,把缓冲区清空啊?
2010-02-09 20:49
yhtian619
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2010-2-5
收藏
得分:0 
回复 3楼 _DaNciNg_
里面是个逗号表达式,可以求值!
2010-02-09 20:50
快速回复:输入流的困惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011379 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved