【问题标题】:C++ std::ifstream: check if characters are left to readC++ std::ifstream:检查字符是否有待读取
【发布时间】:2013-05-11 21:37:21
【问题描述】:

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

【问题讨论】:

  • 在某些已删除的 cmets 中,您提到了阻塞。因此,需要明确的是,没有阻塞就无法做到这一点。
  • 我认为在很多情况下stream.eof() 将是最好的解决方案。有关详细信息,请参阅en.cppreference.com/w/cpp/io/basic_ios/eof。尽管文件中的最后一个字符已被读取,但stream.eof() 可能会返回 false。

标签: c++ stream ifstream


【解决方案1】:

要在编辑后获得您要询问的内容,您可以使用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 正如 MooingDuck 指出的那样,没有阻塞就没有办法做到这一点,也就是说,没有实际读取或尝试读取和失败,来自 关联字符序列的下一个字符 (在某些已删除的版本中,您提到了串行端口)到存在于 ifstream 对象内的缓冲区中。被窥视的字符将保持未读状态,因此从 ifstream 中读取的下一次将返回它,但它只会在它从外部设备到达流中后发生。
【解决方案2】:

你应该把读操作放在你的while条件中:

while(stream >> buffer) {
    ...

这将一直读取,直到流为空或发生另一个错误。

...但如果你真的想一次读一个字符,你应该读这个:Reading a single character from an fstream?

【讨论】:

  • stream >> 缓冲区总是阻塞的,放在哪里都没关系。
  • 您的链接中的解决方案也被阻止了。
猜你喜欢
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2013-09-19
相关资源
最近更新 更多