2013-10-24 10 views
5

Il seguente programma dimostra un'incoerenza nel comportamento di std :: getline tra libC++ e libstdC++ (usando clang3.3).clang 3.3/Xcode & libC++: std :: getline non legge i dati dopo aver chiamato ifstream :: clear()

Il programma apre il file testfile, lo legge fino a eof, quindi cancella i bit di errore utilizzando ifstream :: clear e prova a leggere dallo stesso filehandle di nuovo per vedere se i nuovi dati sono stati aggiunti al file.

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

using namespace std; 

int main() { 
    ifstream* file = new ifstream("testfile"); 
    if (! file->is_open()) { 
     cout << "testfile does not exist" << endl; 
     return -1; 
    } 

    while (1) { 
     file->clear(); // remove end of file evil bits 
     string line; 

     // workaround: 
     // file->seekg(file->tellg()); 

     while (getline(*file, line)) 
      cout << "read line: " << line << endl; 

     if (file->eof()) 
      cout << "File reports eof after getline\n"; 

     usleep(1000000); 
    } 
} 

Utilizzando libstdC++ (senza che il compilatore materia), se si aggiungono i dati per testfile mentre il programma è in esecuzione, i dati verranno letti dalla chiamata getline nella prossima iterazione del ciclo.

In clang 3.3 su OS-X con libC++, dopo la prima volta che viene rilevata la fine del file, getline fallirà sempre e imposterà il bit di fine su tutte le chiamate successive, senza leggere alcun dato aggiunto al file. Scompattando la soluzione alternativa, che cerca solo la posizione corrente, ripristina il comportamento di libstdC++. Compilare contro libstdC++ con clang ++ -stdlib = libstdC++ ripristina anche il vecchio comportamento.

Qualcuno sa se questo è un cambiamento previsto? Sto cercando di farlo in un modo che non è supportato o questo è un problema delle attuali versioni di libC++?

La versione clang che innesca questo comportamento per me è il più recente fornito con XCode per Mavericks:

Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.0.0 
Thread model: posix 

La libc libreria ++ che si collega contro ha questo le informazioni sulla versione:

/usr/lib/libc++.1.dylib: 
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) 
/usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 48.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
+0

Forse un bug dovrebbe essere segnalato contro la libreria 'libC++' - mi sembra un bug. –

+0

L'ho inviato al bugtracker libC++: [link] (http://llvm.org/bugs/show_bug.cgi?id=17688) –

risposta

2

Per sincronizzare il buffer interno dello ifstream con il dispositivo esterno è necessario chiamare:

file->sync(); 
Problemi correlati