cin.eof()功能

Mah*_*esh 8 c++ iostream visual-c++

我理解cin.eof()测试流格式.在输入时,输入错误时不会到达字符结尾.我在MSV C++ 2010上对此进行了测试,并没有理解奇怪的结果.无论我给出什么输入,我都会收到程序中存在的格式错误消息.

#include <iostream>
using namespace std;

int main()
{
    int i;
    cin>> i;

    if(!cin.eof())
    {
        cout<< "\n Format Error \n";
    }
    else
    {
        cout<< "\n Correct Input \n";
    }

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果我预计:

i =的值

  1. 10 => 正确输入但输出为格式错误
  2. 12a => 格式错误

有人可以解释我哪里错了.谢谢.

sbi*_*sbi 19

std::cin.eof()测试文件结束(因此eof),而不是错误.对于错误检查使用!std::cin.good(),内置转换运算符(if(std::cin))或布尔否定运算符(if(!std::cin)).


Shi*_*dra 13

使用以下方式直接测试流的状态:

while (cin >> i)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到Stack Overflow.您的问题被标记为"低质量",因为它极其简洁.虽然准确,但最好提供一些解释为什么你的答案是正确的,特别是在很久以前(大约一年前)问过这个问题时,有多个答案.还要注意编辑框上方的`{}`图标; 可用于缩进代码片段. (5认同)

AnT*_*AnT 7

要使输入流进入 EOF 状态,您必须实际尝试读取流末尾之后的内容。即,到达流中的流结束位置是不够的,有必要实际尝试读取超出末尾的字符。此尝试将导致 EOF 状态被激活,这反过来又会使cin.eof()返回 true。

然而,在你的情况下,你不仅没有这样做,你(很可能)甚至没有到达流的末尾。如果您10从键盘输入,您可能是通过按[Enter]键完成输入。这导致换行符被添加到输入流中。因此,在这种情况下,您实际上用运算>>符解析的实际上是一个10\n序列。由于您int从流中请求了一个值,因此它只从流中读取数字字符,即它读取10,但它停在\n。那\n仍然在流中。你从来没有读过它。因此,显然,您的代码永远不会到达流中的文件末尾位置。你必须有理由预料到cin.eof()会出现true这种情况。