2012-03-30 10 views
0

Ich baue ein Programm, das Textdateien liest, die eine Liste von Zahlen enthalten. Diese Listen enthalten eine Reihe sortierter Zahlen, von denen jede eine unterschiedliche Anzahl von Werten enthalten kann. Zum Beispiel kann Datei 1 eine Liste von 2 Nummern und Datei 2 kann eine Liste von 20 haben.C++ Datei weiterlesen Nach eof()?

Der Punkt des Programms ist, um jede dieser Textdateien (die Zahlen in aufsteigender Reihenfolge enthalten) Zeile für Zeile zu lesen , dann legen Sie sie in einer neuen Textdatei in aufsteigender Reihenfolge. Wenn jedoch eine Liste wirklich kurz ist, dann bekomme ich einen eof() Fehler, was dazu führt, dass der Dateileser in den Fehlerzustand geht, der es nicht erlaubt, die verbleibenden Werte in der längeren Textdatei zu lesen.

Hier ist mein Code der iteriert über die beiden Textdateien:

int main() { 
int numbers1 = 0, numbers2 = 0, fillCounter = 0, iteration = 0; 
char grabNext = 'b'; 
ifstream file1, file2, fileFiller; 
ofstream fout; 
file1.open("numbers1.txt"); 
file2.open("numbers2.txt"); 
fout.open("output.txt"); 

//Check and see if the opening operation was successful 
if (file1.fail() || file2.fail()) { 
    cout << "The progran could not open the related necessary files. Check and see if they exist!" 
     << endl; 

    exit(1); 
} 

do { 
//In theory, whenever the file1 gives an eof, I should be able to iterate over the remaining lines of file2 
    if (file1.eof()) { 
     do { 
      fout << numbers2 << endl; 
     } while(!file2.eof()); 

     break; 
    } 

//In theory, whenever the file2 gives an eof, I should be able to iterate over the remaining lines of file1 
    if (file2.eof()) { 
     do { 
      fout << numbers1 << endl; 
      break; 
     } while(!file1.eof()); 

     break; 
    } 

    if (grabNext == 'b') { 
     file1 >> numbers1; 
     file2 >> numbers2; 
    } else if (grabNext == 'l') { 
     file1 >> numbers1; 
    } else if (grabNext == 'u') { 
     file2 >> numbers2; 
    } 

    cout << numbers1 << " " << numbers2 << endl; 

    if (numbers1 < numbers2) { 
     fout << numbers1 << endl; 
     grabNext = 'l'; 
    } else if (numbers1 > numbers2) { 
     fout << numbers2 << endl; 
     grabNext = 'u'; 
    } 

    iteration++; 
} while(true); 

}

Es folgt eine Beispieltextdatei 1:

-1 
3 
5 
7 
9 

Hier wird zB Textdatei 2:

2 
4 
10 
12 
16 

Meine Frage ist, nachdem ich aus einer Datei eof() erreiche, dass ich den anderen weiter lesen könnte bis dieser erreicht?

Ich habe überall ohne Glück gesucht.

Vielen Dank für Ihre Zeit.

+1

Das 'eof' Flag sagt nicht die Zukunft voraus. Es wird Ihnen nicht sagen, ob ein zukünftiger Lesevorgang erfolgreich sein wird, sondern nur, warum ein Lesevorgang in der Vergangenheit fehlgeschlagen ist. Sie müssen eine Lesefunktion verwenden, mit der Sie Fehler behandeln und dann erst stoppen können, wenn beide Dateien fehlgeschlagen sind. –

+0

Vielen Dank für Ihre Antwort, David. Ich bin relativ neu in C++. Gibt es eine Chance, dass du demonstrieren kannst, worüber du redest? –

+2

Siehe [diese Seite] (http://mathbits.com/mathbits/compsci/files/end.htm) für ein Beispiel, wie Daten so gelesen werden können, dass Sie Fehler behandeln und die Daten dann nur beim Lesen verarbeiten können gelungen. –

Antwort

1

Beachten Sie, dass Sie auch Endlosschleifen haben:

do { 
     fout << numbers1 << endl; 
     break; 
    } while(!file1.eof()); 

Nichts innerhalb der Schleife ändert file1 verursachen EOF zu nähern().

+0

Es gibt keine Schleife da sind alle, wegen der 'Pause;'. –

+0

Whoops - die unendliche Schleife ist im anderen Fall: if (file1.eof()) { do { fout << numbers2 << endl; } while (! Datei2.EOF()); Pause; } – DRVic