c++ - 清除 eof 位不适用于 while 循环

标签 c++ eof getline

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

我本质上是在使用。

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 分钟。
  • 输入文件已从第三方添加了新行。
  • sleep 后它醒来并回到 while 循环。
  • 它成功地从输入中检索到新行。但未能 再次进入while循环

最佳答案

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

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

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

关于c++ - 清除 eof 位不适用于 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684563/

相关文章:

.net - BeginPaint 的 hWnd 参数值是否正确?

c++ - QML - 将信号从 C++ 连接到 qml

c - 逐个字符打印标准输入直到文件末尾

C++ 如何为 ifstream 成员正确使用 getline

c++ - cin 和 getline 跳过输入

c++ - 如果我要为C++程序获取行号,应该以什么格式写入.txt文件?

c++ - 可以仅使用 std::sort() 将零移动到数组的末尾吗?

c++ - 分配提示是否被使用?

Java 可序列化 EOF

java - 如何使用 Scanner 类中的 hasNext()?