曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3917|回复: 0
打印 上一主题 下一主题

报告 cin 工作情况的几个成员函数/eof()/fail()/bad()/good()

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-7-7 10:36:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
efo() : 如果达到文件 (或输入) 的末尾,返回 true 。

faile() : 如果 cin 无法工作,返回 true 。

bad() : 如果 cin 因为比较严重的原因 (比如内存不足) 而无法工作,返回 true 。

good() : 如果以上情况都没发生,返回 true 。

比如:
[C++] 纯文本查看 复制代码
    int year;
    std::cout << "Enter a year: ";

        if (std::cin.good()) 
        std::cout << "you enter " << year << '\n';
    else
        std::cout << "Wrong input" << '\n';

这样当 cin 接收到字符输入时就会提示出错。不然在默认情况下,cin 会将字符输入也赋值到整数中,从而会造成计算错误。

上面的  if (std::cin.good())  也可以简写成 if(std::cin >> year) 。

如果 cin.fail() 或 cin.bad() 调用的返回值为 true ,那么就说明有问题发生。这类问题的基本处理步骤是:先用 clear() 函数清除 cin 的出错状态(clear() 只能清除出错状态,而不清理输入缓冲区),然后再用 ignore() 函数将输入缓冲区里的现有输入全部丢弃,比如:
[C++] 纯文本查看 复制代码
while (!(std::cin >> year)) {
        std::cin.clear();
        std::cin.ignore(100, '\n');
        std::cout << "must be integer, reinput" << '\n';
        std::cout << "Enter a year: ";
}

如果上面不用 clean() 函数清除错误状态,那么 while() 的判断里就会一直认为 std::cin >> year 这个表达式已经有了返回,而且返回的状态就是前一次的输入状态,这样就会造成无限循环输出 while() 循环体里的内容。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-21 10:04 , Processed in 0.091946 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表