2017-09-28 87 views
0

我想模擬這種情況:我的程序剛剛從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。 –

回答

0

您正在將其添加到錯誤的位置。 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

正確,但行緩衝是標準行爲,通常提供足夠的同步點。您可能遇到的其他問題與文件鎖定有關... –