2017-11-28 6 views
0

Ich habe ein einfaches Programm, das den Preis für die verkauften Artikel berechnet. Und speichert die Informationen in einer a-Datei. Ich versuche, aus dieser Datei zu lesen, die eine Zeichenfolge und Ganzzahlen enthält. Was ist eine gute Möglichkeit, bis zum Ende der Datei zu lesen? Ich verwende derzeit die EOF-Funktion, funktioniert aber nicht richtig. Es wiederholt die letzten zwei Zeilen.Proper Weg bis zum Ende der Datei zu lesen, wenn mehrere Datentypen C++

void viewTransactions(); 
void viewTransactions() 
{ 
    string productName,; 
    int quantity, totalPrice; 

    ifstream infile; 
    infile.open ("transactions.txt"); 
    while(!infile.eof()) 
    { 
    getline(infile, productName); 
    infile >> quantity; 
    infile >> totalPrice; 
    infile.ignore(100, '\n'); 

    cout << productName << endl; 
    cout << quantity << endl; 
    cout << totalPrice << endl; 


    } 
} 

"transactions.txt" enthält:

Product 
1 
5 
Product 
2 
10 
Product 
3 
15 

Console Output File Wenn Read:

Product 
1 
5 
Product 
2 
10 
Product 
3 
15 

3 
15 
+1

Können Sie bitte eine Beispieltextdatei zur Verfügung stellen? Ich meine 2-3 Zeilen der "transactions.txt". – gsamaras

+0

@gsamaras Ich habe eingefügt, was Sie gefragt haben, können Sie einen Blick plz. –

+0

Danke Hugo. Sie haben einen klassischen Fehler gemacht, also habe ich Ihre Frage zum kanonischen Link gestellt. Darüber hinaus hat @BasileStarynkevitch bereits einen Workaround vorgeschlagen (ich habe es nicht überprüft), so dass meine Arbeit hier erledigt ist. Viel Glück! =) – gsamaras

Antwort

0

infile.eof() ist nur gültig nach eine Leseoperation (nicht "vor"). Und std::getline kann so eingestellt das eofbit, so besseren Code:

for(;;) { 
    getline(infile, productName); 
    if (infile.eof()) break; 
    infile >> quantity; 
    infile >> totalPrice; 

etc ... (oder verwenden Sie einen do ... while(!infile.eof()) Schleife).

Es gibt einen Grund dafür (zumindest auf POSIX zB Linux): es gibt keine Möglichkeit, auf der OS-Ebene (dh unter Verwendung von Systemaufrufen in syscalls(2) aufgeführt), diese EOF-Bedingung magisch zu testen, ist es ein Ergebnis von einigen vorherigeread(2) Betrieb.

BTW, sollten Sie wahrscheinlich mit allen Warnungen und Debug-Informationen kompilieren (g++ -Wall -Wextra -g mit GCC). Dann verwenden Sie den Debugger gdb und Sie werden diesen Fehler selbst gefunden haben.

Verwandte Themen