曲径通幽论坛

标题: 报告 cin 工作情况的几个成员函数/eof()/fail()/bad()/good() [打印本页]

作者: beyes    时间: 2011-7-7 10:36
标题: 报告 cin 工作情况的几个成员函数/eof()/fail()/bad()/good()
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() 循环体里的内容。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2