2015-05-01 9 views
9

Stavo cercando di scrivere un codice in C++ fa qualcosa come tail -f in linux. Ho trovato questa domanda: How to read a growing text file in C++? e implementato lo stesso. Ho creato un temp.txt e ho iniziato a fare echo "temp" >> temp.txt. Ma il mio programma non sta stampando gli aggiornamenti fatti sul file. Cosa sto facendo male? Questo è il codice che sto utilizzandoC++ Perché il mio codice non stampa gli aggiornamenti apportati al file di donazione

#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

ho provato lo stesso codice su una macchina Linux e stava funzionando benissimo, ma non funziona su Mac. Stavo usando gcc per compilare il codice.

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 

UPDATE 2
ho indagato ulteriormente e si rese conto che non stavo usando gcc dopo tutto. Ho installato gcc separatamente e ora funziona bene. Si tratta di un bug in clang?

risposta

0

Quanto segue funziona quando si accoda a un file.

#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;         
}            

Per il caso generale (ad esempio la manipolazione di file troncamento, ecc), si potrebbe lavorare con tellg/seekg.

1

Ho provato con il codice e funziona correttamente.

codice compilato utilizzando comando seguente:

g++ main.cpp -o testmain 

Ho aperto due terminali: Da un primo terminale di creare temp.txt applicazione testmain & corsa. e da un altro esegui il comando echo e funzionerebbe correttamente.

run application

enter image description here

Si desidera raggiunto questo o si è tentato di qualcos'altro ...

+0

dispiaciuto per lo stesso scatto. aggiornato secondo –

+0

Immagino che questo sia un problema con Mac gcc – banarun

2

E 'del tutto possibile che cout tampone non funzionava nei test, perché la dimensione del buffer non ha raggiunto il limite di overflow. È possibile provare a svuotare il buffer eseguendo std::cout << line << std::endl; anziché std::cout << line << "\n"; o chiamando std::cout.flush()l prima dello sleep(1);. Entrambi i metodi dovrebbero funzionare in modo affidabile con clang e gcc.

Le risposte a queste domande spiegano il buffering molto bene:

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

Strange behaviour of std::cout in Linux

Problemi correlati