【问题标题】:Clearing eof bit not working with while loop清除 eof 位不适用于 while 循环
【发布时间】:2015-12-17 12:34:39
【问题描述】:

我正在尝试编写一个程序,它会持续监控日志文件并将特定项目输出到新文件中。

我基本上在使用。

for (int i = 1; i < y; i ++)
    getline(read, line); // skips to the last known end

while (getline(read, line))
{
cout << line;
}

read.clear();

我还跟踪我在变量上使用增量运算符的行。在文件的末尾,我清除了 eof 位并查找到我所在的最后一行。从使用调试器来看,它似乎可以工作。我在文件中检索到正在写入的下一行,但是当我回调我的 while (getline(read,line)); 时,它会跳过 while 循环,这是为什么呢?

  • 程序读取文件的最后一行。
  • 睡 5 分钟。
  • 输入文件已从第三方添加了新行。
  • 在睡眠后唤醒并返回到 while 循环。
  • 它成功地从输入中检索到新行。但未能 再次进入while循环

【问题讨论】:

  • seekg(y) 查找字节偏移量y,而不是行号y。你需要使用tellg()并记住你想要的行的字节偏移量,以便稍后返回。
  • @IgorTandetnik 哦,我错了。我使用 for 循环跳过 getline 到最后。我已经更新了帖子。我一直在使用 seekg。
  • 某处是否有倒带(寻找开始)?没有代码,你的代码毫无意义。
  • 使用open()read()pread() 从另一个进程主动写入的文件中读取可能会获得更好的结果。这实际上不是一个容易解决的问题,并且在代码和文件之间放置抽象层和缓冲层(例如使用 C++ istream)不太可能很好地工作。正如你所发现的那样。
  • @IgorTandetnik 我相信因为我从不关闭输入流,它保留它所在的当前行,它只在程序结束并重新启动时进行迭代,它所在的行也被存储在文件中,并在启动时收到。

标签: c++ eof getline


【解决方案1】:

当在文件末尾使用std::getline() 时,std::iostate::eofbitstd::iostate::failbit 都会被设置。事实上,是std::iostate::failbit 导致循环退出。您需要在任何搜索之前清除这两个标志。

对于需要使用 IOStreams 的系统,我实际上不会费心阅读前导行,而只是稍等片刻,清除标志,然后重试。主要问题是检测是否读取了完整的行,这可以通过简单地读取单个字符来完成,例如,使用std::istreambuf_iterator&lt;char&gt;

否则我会寻找一个系统 API,它提供某种指示,表明新数据在文件中可用。较旧的系统通常不提供此类设施,但较新的系统通常具有一些基于事件的接口,可用于获取新的可用数据。优点通常是进程不会轮询新数据,而是闲置等待,直到收到有关新数据的通知。我自己没有使用过,但似乎 libuv 以某种与平台无关的形式进行此类操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2012-06-25
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多