2015-05-01 67 views
9

我試圖用C++編寫代碼,在linux中執行類似tail -f的操作。我發現這個問題: How to read a growing text file in C++?並實施相同。我創建了一個temp.txt並開始做echo "temp" >> temp.txt。但是我的程序不打印對文件所做的更新。我做錯了什麼?這是我使用C++爲什麼我的代碼不能打印更新到give文件

#include <iostream> 
#include <string> 
#include <fstream> 
#include <unistd.h> 

int main() 
{ 
    std::ifstream ifs("temp.txt"); 

    if (ifs.is_open()) 
    { 
     std::string line; 
     while (true) 
     { 
      while (std::getline(ifs, line)) std::cout << line << "\n"; 
      if (!ifs.eof()) break; // Ensure end of read was EOF. 
      ifs.clear(); 
      sleep(3); 
     } 
    } 

    return 0; 
} 

UPDATE

我試圖在Linux計算機上相同的代碼,它工作正常的代碼,但它不工作在Mac上。我使用gcc來編譯代碼。

gcc -v

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) 
Target: x86_64-apple-darwin14.3.0 
Thread model: posix 

更新2
我進一步研究和認識,我沒有用gcc畢竟。我已經單獨安裝了gcc,現在工作正常。這是在clang中的錯誤嗎?

回答

0

追加到文件時,以下工作。

#include <iostream>       
#include <string>        
#include <fstream>       
#include <unistd.h>       

int main()         
{            
    std::ifstream ifs("temp.txt");   

    if (ifs.is_open())      
    {           
     std::string line;      
     while (true)       
     {          
      while (ifs.good()) { // while we are good    
       std::getline(ifs, line); // read a line  
       if (ifs.eof()) break; // if this is the end, break  
       std::cout << line << "\n"; 
      }         
      ifs.clear(); // clear the error flags      
      sleep(1); // sleep a bit       
     }          
    }           

    return 0;         
}            

對於一般情況(例如處理文件截斷等),您可以使用tellg/seekg。

1

我試着用你的代碼,它工作正常。

使用下面的命令編譯代碼:

g++ main.cpp -o testmain 

我有打開兩個終端: 在一個終端首先創建TEMP.TXT &運行應用testmain。 並從另一個運行echo命令,它會工作正常。

run application

enter image description here

你想實現這個或者你嘗試別的東西...

+0

對不起同一單元。更新後的第二個 –

+0

我想這是Mac gcc的一個問題 – banarun

2

這很可能是cout緩衝區並沒有在測試中沖洗,因爲緩衝區大小沒有達到溢出限制。 您可以嘗試通過執行std::cout << line << std::endl;而不是std::cout << line << "\n";或在sleep(1);之前調用std::cout.flush()l來刷新緩衝區。這兩種方式都應該可以在clang和gcc下可靠地工作。

這些問題的答案解釋緩衝真的很好:

C++ cout and cin buffers, and buffers in general

Strange behaviour of std::cout in Linux

相關問題