如何检查 cin 是否为文件结尾?

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

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


我不想在一开始就从cin读入,因为第一个输入可能很有用。 - Catiger3331
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - GingerPlusPlus
1
可能是在调用std :: getline之前检查数据可用性的重复问题。 - Captain Obvlious
1个回答

5

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

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
}

没有数据的情况可能会隐式地被测试,例如,通过查看读取数据结构的大小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接