2010-08-30 9 views
7

Ich laufe mich selbst durch ein C++ - Lehrbuch, das ich als Auffrischung der C++ - Programmierung habe. Eines der Übungsprobleme (ohne zu sehr ins Detail zu gehen) möchte, dass ich eine Funktion definiere, die istream oder cin (z. B. istream) als Argument übergeben kann. Von dort muss ich den Stream durchlesen. Problem ist, kann ich nicht einen Weg finden, diese eine Funktion verwenden cin und ifstream, um effektiv das Ende des Streams zu finden. NämlichFinden Sie das Ende des Streams für Cin & Ifstream?

while(input_stream.peek() != EOF) 

wird nicht für cin arbeiten. Ich könnte die Funktion überarbeiten, um nach einer bestimmten Phrase zu suchen (wie "#End of Stream #" oder etwas), aber ich denke, das ist eine schlechte Idee, wenn der Dateistream, den ich passiere, genau diese Phrase hat.

Ich habe gedacht, Funktion Überladung zu verwenden, aber bisher hat das Buch erwähnt, wenn es mich dies tun soll. Ich werde wahrscheinlich zu viel Aufwand in dieses eine Übungs-Problem investieren, aber ich genieße den kreativen Prozess und bin neugierig, ob es so einen Weg gibt, dies ohne Überlastung zu tun.

+0

prüft diese Frage: http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input -stream-stdin – Archie

Antwort

4

eof()funktioniert arbeiten für CIN. Du machst etwas falsches; Bitte posten Sie Ihren Code. Ein häufiger Stolperstein ist, dass eof Flag gesetzt wird nach Sie versuchen, hinter dem Ende des Streams zu lesen. Hier

ist eine Demonstration:

#include <iostream> 
#include <string> 

int main(int, char*[]) 
{ 
    std::string s; 
    for (unsigned n = 0; n < 5; ++n) 
    { 
     bool before = std::cin.eof(); 
     std::cin >> s; 
     bool after = std::cin.eof(); 
     std::cout << int(before) << " " << int(after) << " " << s << std::endl; 
    } 

    return 0; 
} 

und seine Ausgabe:

D:>t 
aaaaa 
0 0 aaaaa 
bbbbb 
0 0 bbbbb 
^Z 
0 1 bbbbb 
1 1 bbbbb 
1 1 bbbbb 

+0

Sorry für die Verwirrung, hatte ich zunächst while (! Input_stream.eof()) aber dann wurde mir klar, dass ich while (input_stream.peek! = EOF) stattdessen geschrieben hatte. Unabhängig davon arbeiten beide Methoden mit control + z (ironischerweise habe ich gerade über den eof-Charakter in Wikipedia gelesen). Danke für die Hilfe atzz und alle! – user435219

+0

Konvertieren Sie den Stream lieber in einen booleschen Wert als '.eof' oder' .bad'. –

2

Warum funktioniert std::cin.eof() nicht? cin signalisiert EOF, wenn stdin schließt, was geschieht, wenn der Benutzer es mit Ctrl + d (* nix) oder Ctrl + z (Windows), oder (im Falle eines Piped-Eingangsstrom) wenn der Piped signalisiert Datei endet

+1

In Windows ist es 'Strg + Z',' Strg + D' ist für UNIX-basierte Systeme. – Archie

+0

@Archie Oh, guter Punkt; fügte hinzu, dass in –

+0

Ah, das funktioniert tatsächlich (gut Strg + Z für Windows sowieso). Entschuldigung, wenn es ein wenig Verwirrung gibt, wie ich ursprünglich während (! Input_stream.eof()) in dem Beitrag zuvor hatte und bearbeitet es zu while (input_stream.peek()! = EOF). Jedenfalls habe ich Bedenken, während while (! Input_stream.eof()) ist, dass, wenn die Funktion liest das EOF-Zeichen das Fail-Bit für input_stream gesetzt ist. Soll das passieren? – user435219

3
(EOF kann mit Strg-Z unter Windows und Strg-D auf vielen anderen OSes erzeugt werden)

Wenn Sie einen Stream in einem booleschen Kontext verwenden, konvertiert er sich selbst in einen Wert, der dem Wert true entspricht, wenn er nicht EOF erreicht hat, und false, wenn versucht wurde, nach dem EOF zu lesen (nicht ist auch falsch, wenn zuvor ein Fehler beim Lesen des Streams aufgetreten ist.

Da die meisten IO-Operationen auf Streams den Stream zurückgeben (so können sie verkettet werden). Sie können Ihre Leseoperation ausführen und das Ergebnis im Test verwenden (wie oben).

So ein Programm einen Strom von Zahlen aus einem Stream zu lesen:

int main() 
{ 
    int x; 

    // Here we try and read a number from the stream. 
    // If this fails (because of EOF or other error) an internal flag is set. 
    // The stream is returned as the result of operator>> 
    // So the stream is then being used in the boolean context of the while() 
    // So it will be converted to true if operator>> worked correctly. 
    //       or false if operator>> failed because of EOF 
    while(std::cin >> x) 
    { 
     // The loop is only entered if operator>> worked correctly. 
     std::cout << "Value: " << x << "\n"; 
    } 

    // Exit when EOF (or other error). 
} 
Verwandte Themen