试图使std :: ifstream再次打开

试图使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,但又失败了。还有什么可以帮助吗?

+0

你想从某个文件中读取而其他人正在写入文件吗? – user463035818

+0

是的,就是这样。更确切地说,在我的程序执行'// main code'部分时,有人可能在文件中添加了一些行,但我们不太可能同时使用data.txt。 –

您正在将其添加到错误的位置。 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.

+0

也许值得补充的是,从一个文件中读取数据,而不使用某种同步机制进行读取并不是一个非常好的想法 – user463035818

+0

正确,但行缓冲是标准行为,通常提供足够的同步点。您可能遇到的其他问题与文件锁定有关... –