如何检查cin是文件结尾?

Cat*_*331 5 c++

int main()
{
    if (cin)
    {
        (...)
    }
    else
    {
        cerr << "No Data!!!" << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Die*_*ühl 5

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

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

您更有可能依赖于一些可用的非空间数据。如果是这样,您可以查看文件中是否还有空间以外的内容:

if (!(std::cin >> std::ws).eof())
  ...
Run Code Online (Sandbox Code Playgroud)

机械手 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
}
Run Code Online (Sandbox Code Playgroud)

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