清除 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 循环,这是为什么?
- 程序读取文件中的最后一行。
- 睡了 5 分钟。
- 输入文件中添加了来自第三方的新行。
- 睡眠后它醒来并返回到 while 循环。
- 它成功地从输入中检索到新行。但未能
再次进入while循环
当在文件末尾使用 std::getline()
时,std::iostate::eofbit
和 std::iostate::failbit
都会被设置。事实上,正是 std::iostate::failbit
导致循环退出。在进行任何搜索之前,您需要清除这两个标志。
对于需要使用 IOStreams 的系统,我实际上不会费心阅读引导行,而只是稍等片刻,清除标志,然后重试。主要问题是检测是否读取了整行,这可以通过简单地读取单个字符来完成,例如,使用 std::istreambuf_iterator<char>
.
否则我会寻找一个系统 API,它提供某种指示表明文件中有新数据可用。较旧的系统通常不提供此类设施,但较新的系统通常具有一些基于事件的接口,可用于获取新的可用数据。优点通常是进程不会轮询新数据,而是空闲地等待直到它收到有关新数据的通知。我自己没有使用过它,但似乎 libuv 以某种平台无关的形式执行此类操作。
我有一个正在尝试编写的程序,它不断监视日志文件并将特定项目输出到新文件中。
本质上我在用
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循环
当在文件末尾使用 std::getline()
时,std::iostate::eofbit
和 std::iostate::failbit
都会被设置。事实上,正是 std::iostate::failbit
导致循环退出。在进行任何搜索之前,您需要清除这两个标志。
对于需要使用 IOStreams 的系统,我实际上不会费心阅读引导行,而只是稍等片刻,清除标志,然后重试。主要问题是检测是否读取了整行,这可以通过简单地读取单个字符来完成,例如,使用 std::istreambuf_iterator<char>
.
否则我会寻找一个系统 API,它提供某种指示表明文件中有新数据可用。较旧的系统通常不提供此类设施,但较新的系统通常具有一些基于事件的接口,可用于获取新的可用数据。优点通常是进程不会轮询新数据,而是空闲地等待直到它收到有关新数据的通知。我自己没有使用过它,但似乎 libuv 以某种平台无关的形式执行此类操作。