2016-05-17 5 views
1

Ich habe eine Funktion, die eine Datei char von char lesen und an die Konsole ausgeben soll, bis sie EOF erreicht. Die Funktion funktioniert einwandfrei und zeigt alle Zeichen an, die ich möchte, aber dann geht es weiter und hört nie am Ende auf.Funktionsstörung mit EOF

Unten ist die Funktion

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    joke.clear(); 
    ch = joke.get(); 
    while (ch != EOF) 
    { 
     cout << ch; 
     ch = joke.get(); 
    } 
} 

Inhalt der Datei unter

aufgeführten

„(Leerzeile) F: Was die Zunge an die Zähne sagen haben?“

Wie ich schon sagte, zeigt es die Linie gut, aber die Schleife geht weiter nach dem Fragezeichen.

Irgendwelche Gedanken darüber, warum dies sein könnte? Sind weitere Informationen erforderlich, um meine Frage richtig beantworten zu können?

Antwort

1

Der kanonische Weg, dies zu tun, ist:

void displayAllLines(ifstream &joke) 
{ 
    char ch; 
    while (true) 
    { 
     ch = joke.get(); 
     if (joke) { 
      cout << ch; 
     } else { 
      break; 
     } 
    } 
} 

Der Ausdruck joke wird auf true auswerten, bis es EOF trifft. Ich bin mir nicht sicher, warum Sie zuerst joke.clear() anrufen möchten.

+1

Es ist nur eine Gewohnheit, die mir beigebracht wurde, wenn ich mit einer Datei anfing. Stellen Sie nur sicher, dass es am Anfang keine Flaggen gibt. Denkst du, dass es sinnlos ist, oder denkst du, dass es möglicherweise schädlich für ein Programm ist? EDIT :: Wie für den Code, den Sie veröffentlicht haben, wird es sicherlich das Programm weiter, aber nicht berücksichtigt Leerzeichen und zeigt alles ohne Leerzeichen – Podo

+0

Auch neugierig, wenn Sie irgendwelche Gedanken haben, warum mein Code * nicht * Arbeit. – Podo

+0

Ii glaube nicht, dass Sie blind '' clear() '' nennen sollten. Wenn Flags gesetzt sind, dann ist das ein Grund und einfach zu löschen, wird nicht helfen. Ihr Code funktioniert nicht, da C++ - Streams EOF nicht wie ein Zeichen als C lesen. C++ streamt die gelesenen Zeichen, bis sie EOF treffen. (Sie geben niemals das EOF-Zeichen zurück - das ist ein C-Ding.) – Phil

1

@Phil antwortete "wie man das in C++ macht". Meine Antwort geht in "warum passiert das" und "wie mache ich das in C" (es funktioniert immer noch in C++).


Da die ASCII-Tabelle von 1 den ganzen Weg geht, und wir haben Byte-Wert 0 ('\0') reserviert für String Beendigung (sprechen C und C++ Sprachen), muss der EOF außerhalb einen besonderen Wert sein, davon.

Deshalb getchar() und auch ifstream::get() geben Sie eine int, nicht eine char. Also alles, was Sie tun müssen, ist

ändern
char ch; 

zu

int ch; 

und warf es für den Druck auf char:

cout << (char) ch; 

Technisch EOF ist in der Regel -1. Ihr char kann den Bereich 0 - 255 haben, was bedeutet, dass er niemals -1 entspricht. Ein vernünftiger Compiler mit -Wall aktiviert sollte Sie zumindest eine Warnung geben.

+0

Allgemeiner, anstelle von' int' verwenden Sie 'std :: istream :: traits_type :: int_type'. Das funktioniert für alle Zeichencodierungen, nicht nur für ASCII. –