2013-10-24 3 views
5

Das folgende Programm demonstriert eine Inkonsistenz im std :: getline-Verhalten zwischen libC++ und libstdC++ (mit clang3.3).clang 3.3/Xcode & libC++: std :: getline liest keine Daten nach dem Aufruf ifstream :: clear()

Das Programm öffnet die Datei testfile, liest es bis eof, löscht dann die Fehlerbits mit ifstream :: clear und versucht erneut von demselben Dateihandle zu lesen, um zu sehen, ob neue Daten an die Datei angehängt wurden.

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

Mit libstdC++ (egal welcher Compiler), wenn Sie Daten anhängen testdat, während das Programm ausgeführt wird, werden die Daten durch die getline Aufruf in der nächsten Schleife Iteration gelesen werden.

In clang 3.3 auf OS-X mit libC++ wird getline nach dem ersten Auftreten des Dateiendes immer fehlschlagen und das eof-Bit bei allen folgenden Aufrufen setzen, ohne Daten zu lesen, die an die Datei angehängt wurden. Das Uncommentment der Problemumgehung, die nur die aktuelle Position sucht, stellt das Verhalten von libstdC++ wieder her. Das Kompilieren gegen libstdC++ mit clang ++ -stdlib = libstdC++ kehrt ebenfalls zum alten Verhalten zurück.

Weiß jemand, ob dies eine erwartete Änderung ist? Versuche ich dies auf eine Weise zu tun, die nicht unterstützt wird oder ist das ein Problem der aktuellen libC++ - Versionen?

Das Klirren Version, die dieses Verhalten für mich auslöst, ist die jüngste mit XCode für Mavericks ausgeliefert:

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

Die libC++ Bibliothek, die gegen diese Versionsinformationen hat verknüpft ist:

/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

Vielleicht sollte ein Fehler gegen die 'libC++' Bibliothek gemeldet werden - es scheint wie ein Fehler für mich. –

+0

Ich habe es dem libC++ Bugtracker übergeben: [link] (http://llvm.org/bugs/show_bug.cgi?id=17688) –

Antwort

2

Um den internen Puffer des ifstream mit dem externen Gerät zu synchronisieren, müssen Sie folgende Nummer anrufen:

file->sync();