我想写一个程序,它可以不断地监视一个日志文件,并将特定的项目输出到一个新的文件中。
我使用的是本质上的程序。
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::eofbit
和 std::iostate::failbit
是设定的。事实上,它是 std::iostate::failbit
导致循环退出。你需要在寻找之前清除这两个标志。
对于一个需要使用IOStreams的系统,我实际上不会去读取前导行,而只是等待一下,清除标志,然后再试。主要的问题是检测是否读取了一个完整的行,这可以通过简单的读取单个字符来完成,例如,使用 std::istreambuf_iterator<char>
.
否则,我会寻找一个系统API,它能提供某种指示,表明一个文件上有新的数据。旧的系统一般不提供这样的设施,但新的系统一般有一些基于事件的接口,可以用来获取新的可用数据。其优点是一般情况下,进程不会轮询新数据,而是闲置等待,直到得到新数据的通知。我自己没有用过,但似乎 libuv 在某种程度上以一种独立于平台的形式来完成这类操作。