2017-11-14 2 views
0

Wenn meine Eingabedatei mit einem Buchstaben beginnt, stoppt sie die while-Schleife, weil sie int1 nicht umschreiben kann. Ich weiß, aber wie könnte ich das erkennen und eine Fehlermeldung anzeigen, dass workinfile>>int1 nicht funktioniert und danach die Schleife fortsetzen ?Mit ifstream while-Schleife, wie ein Eingabefehler zu zeigen, und in der nächsten Zeile fortgesetzt?

cin>>filename; 
ifstream workingfile(filename); 

while (workingfile>>int1>>int2>>string1>>string2) { 
    cout<<int1<<int2<<string1<<string2<<endl; 
    linenumread++; 
} 

Ich habe versucht zu tun, aber es funktioniert nicht, würde jede Hilfe

while (workingfile>>int1>>int2>>string1>>string2) { 
    if(!(workingfile>>int1)) 
    { 
     cout<<"Error first value is not an integer"<<endl; 
     continue; 
    } 
    cout<<int1<<int2<<string1<<string2<<endl; 
    linenumread++; 
} 

auch möglich sein, geschätzt werden, um zu erkennen, wäre es, wenn es stoppt auch die Saiten zu lesen?

Die Eingabedatei wie diese

10 10 ab bc 
11 11 cd ef 
a 
12 12 gh hi 

Ich möchte aussehen würde erkennen, wenn sie auf eine ungültige Eingabe trifft, zeigen eine Fehlermeldung, und mit der nächsten Zeile in der Datei fortzusetzen.

+0

Die while-Schleife jeder ungültige Eingabe zu stoppen. mit 'std :: getline()' in der Schleifenbedingung, der beste Ansatz wäre eine komplette Linie zu lesen und den String mit 'std :: istringstream' analysiert und für jeden Wert zu überprüfen. – user0042

+0

Willkommen bei Stack Overflow! Ihr Code ist unvollständig. insbesondere scheint es eine 'main()' Funktion und mindestens ein '# include' zu ​​fehlen. Bitte [bearbeiten] Sie Ihren Code, so dass es ein [mcve] Ihres Problems ist, dann können wir versuchen, es zu reproduzieren und zu lösen. Sie sollten auch [fragen] lesen. –

+1

@TobySpeight Es ist nicht wirklich notwendig, hier den vollständigen Code zu liefern. Das Problem ist bei dem gegebenen Beispiel ziemlich offensichtlich. Ich habe heute weit schlimmere Fragen gesehen. – user0042

Antwort

5

Für diese Art der Eingabe, dann ist es in der Regel besser, eine komplette Linie zu lesen, und dann die Werte aus dieser Zeile zu extrahieren. Wenn die Zeile nicht analysiert werden kann, können Sie einen Fehler für diese Zeile melden und am Anfang der nächsten Zeile fortfahren.

die etwa wie folgt aussehen:

std::string line; 
while (std::getline(workingfile, line)) // Read a whole line per cycle 
{ 
    std::istringstream workingline(line); // Create a stream from the line 
    // Parse all variables separately from the line's stream 
    if(!(workingline>>int1)) 
    { 
     cout<<"Error first value is not an integer"<<endl; 
     continue; 
    } 
    if(!(workingline>>int2) 
    { 
     cout<<"Error second value is not an integer"<<endl; 
     continue; 
    } 
    // ^^^^ a.s.o. ... 
    cout<<int1<<int2<<string1<<string2<<endl; 
    linenumread++; 
} 
+0

ich die getline Methode auch wirklich versucht, aber ich konnte sie nicht in einzelne Variablen aufgeteilt, ich wusste nicht, über istringstream Ich werde es Dank nachschlagen – Lewis

+0

@Lewis Sehen Sie hier: http: //en.cppreference. com/w/CPP/io/basic_istream – user0042

+0

Hey wollte nur wissen, dass Sie lassen dies enorm mein Projekt geholfen hat, und ich bin durch mein Projekt nur fliegen, für das Sie so sehr danken. – Lewis

Verwandte Themen