如何检查cin是文件的结尾?

时间:2015-12-14 18:59:12

标签: c++

int main()
{
    if (cin)
    {
        (...)
    }
    else
    {
        cerr << "No Data!!!" << endl;
    }
}

我想检查输入是否有任何数据,但即使我只在开头输入 Ctrl + Z ,也不会显示错误信息。

1 个答案:

答案 0 :(得分:4)

在您尝试阅读之前,该流不知道是否有任何有用的数据。至少你需要查看第一个字符,例如,使用

if (std::cin.peek() != std::char_traits<char>::eof()) {
    // do something with the potentially present input.
}
else {
    // fail
}

您更有可能依赖某些非空间数据。如果是这样,你可以看到文件中是否还有空格:

if (!(std::cin >> std::ws).eof())
  ...

操纵器 std::ws将跳过前导空格。当到达非空白字符或文件末尾时,它将停止。如果到达文件末尾,std::cin.eof()将为true

一般来说,我不会费心,而是尝试阅读第一项。如果没有任何内容被阅读,那么失败仍然是可行的:

bool hasData = false;
while (std::cin >> some >> data) {
    hasData = true;
    // do something with the input
}
if (!hasData) {
    // report that there was no data at all
}

无数据情况可以隐式测试,例如,通过查看读取数据结构的大小。