2016-07-30 36 views
1

I und Fehler erhalten, während zwei aufeinanderfolgende freopen s tun, file1 enthalten gerade Anzahl von IntsC++ freopen 2 Dateien Fehler

int x, y; 
freopen("file1", "r", stdin); 

while (cin >> x) { 
    cin >> y; 
} 

freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

Druckdaten in der 1. Datei funktionieren gut, während im zweiten Fall x falsch ist,

Wenn ich aus der ersten Schleife vor dem Erreichen des Endes bricht alles funktioniert gut,

was passiert mit cin hier?

+0

freopen eine C-Library-Funktion, nicht eine C++ Bibliothek Funktion. –

+0

Offensichtlich bleibt die End-of-File-Bedingung auf 'stdin' stecken und wird nicht durch' freopen' gelöscht. Seine Manual-Seite sagt nichts über das erwartete Verhalten aus. Sie sollten in der Lage sein, diese Arbeit zu bekommen, indem Sie 'clearerr()' explizit aufrufen. –

+0

cin und >> sind definitiv C++ und freopen und stdin, obwohl sie zur c-standardbibliothek gehören, können sie in C++ – Christophe

Antwort

2

Ursache des Problems:

Das Problem kommt von der Mischung von C-Bibliothek mit C++ Bibliothek.

Ihre freopen() funktioniert gut auf stdin. Wenn Sie denselben Code mit scanf() schreiben würden, um direkt auf stdin zu lesen, würde es perfekt funktionieren. Aber Ihr Programm liest nicht stdin: Es extrahiert die Eingabe von cin, mit der Tatsache, dass cin is synchronized with stdin.

Leider an error state flag wie eof(), die auf dem cin Strom am Ende fo der ersten Datei gesetzt wird, bleiben trotz der zweite auf dem darunterliegenden stdin wieder öffnen.

Wie es lösen:

Sie müssen nur den Zustand von cin mit cin.clear() zurück:

while (cin >> x) { 
    cin >> y; 
} 
cin.clear(); // <============= add this 
freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

Vorschlag:

Es gibt keine Notwendigkeit, in C++ zu spielen mit stdin Dateien über cin lesen. Schreiben Sie Ihren Code mit einer istream. Anschließend können Sie diesen Code verwenden entweder mit cin oder auf einem ifstream:

void process_input(istream &is) 
{ 
    int x, y; 
    while (is >> x) 
     cout <<x<<endl; 
} 
int main() 
{ 
    ifstream ifs1("file1"); 
    process_input (ifs1); // or cin if you prefer 
    ifstream ifs2("file2"); 
    process_input (ifs2); 
}