清除 eof 位不适用于 while 循环

Clearing eof bit not working with while loop

我有一个正在尝试编写的程序,它不断监视日志文件并将特定项目输出到新文件中。

本质上我在用

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 循环,这是为什么?

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

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

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