试图使std :: ifstream再次打开
我想模拟这种情况:我的程序刚刚从std :: ifstream(例如,为“data.txt”文本文件)读取最后一行并进行一些操作这会花费很多时间,所以有人可能会在文本文件中追加其他行。这里试图使std :: ifstream再次打开
while (std::getline(fs, str)) // fs is of std::ifstream type, str is std::string
{
//main code
ifs.clear(); // (1)
ifs.setstate(std::ios_base::goodbit); // (2)
}
我的代码,我有一段时间...行设置一个断点,并尝试从那里读的是最后行后添加新行DATA.TXT。我第一次尝试失败。我试图将(1),(2)或它们的组合添加到我的代码中,以使eofbit = false,但又失败了。还有什么可以帮助吗?
您正在将其添加到错误的位置。 EOF在while
的条件语句中遇到,您无法阻止它,并且您无法在循环中纠正它。
答案是把读取循环的另一个循环中:
while (...)
{
fs.clear();
std::string str;
while (getline(fs, str))
{
...
}
}
这里的踢球者:你的程序将不断滥发以EOF文件读取尝试,这是不是很CPU友好。您应该在声明条件的顶部添加一些内容以缓解这种情况。
- 的短位(如四分之一秒)
- 等待只需睡在文件更新
都需要特定的操作系统的代码。后者是优选的。
Here’s a little library on GitHub that covers all the bases.
也许值得补充的是,从一个文件中读取数据,而不使用某种同步机制进行读取并不是一个非常好的想法 – user463035818
正确,但行缓冲是标准行为,通常提供足够的同步点。您可能遇到的其他问题与文件锁定有关... –
你想从某个文件中读取而其他人正在写入文件吗? – user463035818
是的,就是这样。更确切地说,在我的程序执行'// main code'部分时,有人可能在文件中添加了一些行,但我们不太可能同时使用data.txt。 –