Frage

Ich bin mit mir durch ein C ++ Lehrbuch, dass ich als Auffrischung muss C ++ Programmierung. Eines der Praxis Probleme (ohne zu sehr ins Detail zu gehen in) will, dass ich eine Funktion definieren, die ifstream oder cin übergeben werden kann (zum Beispiel istream) als Argument. Von dort habe ich durch den Strom zu lesen. Das Problem ist, ich kann nicht einen Weg finden, um diese zu haben, einen Funktion Gebrauch cin und ifstream, um effektiv das Ende des Stream zu finden. Das heißt,

while(input_stream.peek() != EOF)

wird nicht für cin an der Arbeit. Ich konnte die Funktion zu, sucht nach einem bestimmten Begriff (wie „#End Stream #“ oder etwas) überarbeiten, aber ich denke, das ist eine schlechte Idee ist, ich, wenn die Datei-Stream diesen genauen Begriff hat passieren.

Ich habe Nutzung Funktion Überlastung gedacht, aber bisher das Buch erwähnt, wenn es will, dass mir dies tun. Ich bin wahrscheinlich zu viel Mühe in diese Praxis Problem setzen, aber ich genieße den kreativen Prozess und neugierig bin, wenn es eine solche Art und Weise, dies zu tun, ohne zu überlasten.

War es hilfreich?

Lösung

eof() funktioniert Arbeit für cin. Sie sind etwas falsch zu machen; Bitte schreiben Sie Ihren Code. Ein gemeinsamer Stein des Anstoß ist, dass eof Flag wird gesetzt 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 dessen Ausgang:

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

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

Andere Tipps

Warum wird nicht std::cin.eof() Arbeit? cin wird EOF-Signal, wenn schließt stdin, die geschieht, wenn der Benutzer Signale mit Strg + d (* Nix) bzw. Strg + z (Windows), oder (in der bei einem verrohrt Eingangsstrom), wenn das verrohrt Datei Enden

Wenn Sie einen Stream in einem Booleschen Kontext verwenden sie dann selbst in einen Wert umwandelt, der auf true entspricht, wenn er die EOF und falsch nicht erreicht, wenn versucht wurde, vorbei an den EOF zu lesen (nicht es ist auch false, wenn es ein vorheriger Fehler aus dem Stream zu lesen).

Da die meisten IO-Operationen auf Ströme den Strom zurückkehren (so können sie verkettet werden). Sie können Ihren Lesevorgang tun und das Ergebnis im Test (wie oben) verwendet werden.

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).
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top