C++ std::ifstream:检查是否还有字符可读

13

有没有办法检查是否还有字符可以从 ifstream 中读取,如果有,该怎么做?如果您确定这不可能,请告诉我。


在一些已删除的评论中,您提到了阻止。因此,明确一点,没有不阻止就能做到这一点的方法。 - Mooing Duck
我认为在许多情况下,stream.eof() 将是最佳解决方案。请参阅 https://en.cppreference.com/w/cpp/io/basic_ios/eof 了解详细信息。但是,在某些情况下,即使已经读取了文件中的最后一个字符,stream.eof() 也可能返回 false。 - jcsahnwaldt Reinstate Monica
2个回答

9

在编辑后获取您所询问的内容,可以使用 peek() 函数:

假设有一个名为 fstd::ifstream 对象:

if (f && f.peek() == EOF)
    std::cout << "Nothing left to read\n";
else
    std::cout << "There is something to read or the stream is bad\n";

请记住,这不是一个“更一般”的问题,而是一个不同的问题(也就是说,将此应用到您原来的问题上会出错)


我原以为这是同一个问题,因为我只想知道如何找出是否还有字符需要读取。我最初提出的所有其他内容都是为了解释为什么我想要这些信息:因为我想知道执行读取操作是否会阻塞,我认为这只是询问问题的原因,而不是问题本身的一部分。事实证明,这些信息对于解决我的问题至关重要,所以我应该提出另一个问题。因此,我将保留最初意图的问题(就像现在这样),并考虑提出一个新问题。 - FSMaxB
@FSMaxB 正如MooingDuck所指出的那样,没有办法在不阻塞的情况下完成这个操作,也就是说,没有实际读取或尝试读取并失败,与ifstream对象中存在的相关字符序列(在某个已删除的版本中您提到了串口)中的下一个字符进入缓冲区。预读的字符将保持未读状态,因此从ifstream读取的下一个字符将返回它,但只有在它从外部设备到达流之后才会发生。 - Cubbi

2
你应该将读取操作放在while条件中:
while(stream >> buffer) {
    ...

那将一直读取,直到流为空或出现其他错误。
...但如果你真的想逐个字符地读取,你应该阅读这篇文章:从 fstream 中读取单个字符?

流 >> 缓冲区始终是阻塞的,无论放在哪里都一样。 - FSMaxB
你链接中的解决方案也是阻塞的。 - FSMaxB

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