清空efe位不能在while循环中使用。

问题描述 投票:0回答:1

我想写一个程序,它可以不断地监视一个日志文件,并将特定的项目输出到一个新的文件中。

我使用的是本质上的程序。

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循环。但未能再次进入while循环
c++ eof getline
1个回答
1
投票

当使用 std::getline() 档尾 std::iostate::eofbitstd::iostate::failbit 是设定的。事实上,它是 std::iostate::failbit 导致循环退出。你需要在寻找之前清除这两个标志。

对于一个需要使用IOStreams的系统,我实际上不会去读取前导行,而只是等待一下,清除标志,然后再试。主要的问题是检测是否读取了一个完整的行,这可以通过简单的读取单个字符来完成,例如,使用 std::istreambuf_iterator<char>.

否则,我会寻找一个系统API,它能提供某种指示,表明一个文件上有新的数据。旧的系统一般不提供这样的设施,但新的系统一般有一些基于事件的接口,可以用来获取新的可用数据。其优点是一般情况下,进程不会轮询新数据,而是闲置等待,直到得到新数据的通知。我自己没有用过,但似乎 libuv 在某种程度上以一种独立于平台的形式来完成这类操作。

© www.soinside.com 2019 - 2024. All rights reserved.