3 Stimmen

while (cin >> x) und Probleme mit dem Dateiende

Ich bin ein wenig verwirrt, was los ist, ich spiele mit einigen Programmen aus "Accelerated C++" und habe ein Problem mit einem der frühen Programme (Seite 35, falls Sie zufällig ein Exemplar in der Nähe haben).

Er verwendet dieses Snippet:

while (cin >> x) {
   ++count;
   sum += x;
}

("count" ist eine ganze Zahl, "x" ist ein Double)

Es funktioniert wie beabsichtigt und erlaubt mir, mehrere Werte einzugeben und sie zu addieren, aber ich kann nicht herausfinden, was mit der "End-of-file"-Signalisierung falsch läuft. Im Buch steht, dass die Schleife so lange läuft, bis das Programm ein Signal für das Ende der Datei erhält, was unter Windows ctrl+z ist.

Das ist alles in Ordnung und funktioniert, aber dann lässt mich mein Programm nicht mehr cin verwenden. Normalerweise richte ich ein Programm so ein, dass es auf eine Zufallsvariable wartet, um zu verhindern, dass die Konsole sofort nach der Ausführung geschlossen wird (gibt es übrigens einen besseren Weg, das zu tun?), und so habe ich das bemerkt, und ich frage mich, ob es eine Lösung gibt. Ich habe viel gesucht, aber nur wenig gefunden, das nicht das sagt, was schon im Buch steht (ctrl+z drücken oder eine nicht-kompatible Art von Eingabe eingeben usw.)

Ich verwende Visual Studio 2008 Express zum Kompilieren.

8voto

CB Bailey Punkte 693084

Wenn man das Ende eines Eingabestroms erreicht hat, ist definitionsgemäß nichts mehr in dem Strom vorhanden, so dass der Versuch, ihn erneut zu lesen, keinen Sinn macht.

Wenn jedoch das "Ende des Stroms" tatsächlich durch ein Sonderzeichen wie Strg-Z unter Windows verursacht wird, besteht die Möglichkeit, dass wir erneut von cin . Der fehlgeschlagene Lesevorgang hat jedoch dazu geführt, dass die eof Flagge auf dem Stream gesetzt werden.

Um dieses Flag (und alle anderen Fehlerflags) zu löschen, können Sie die Funktion clear Methode.

std::cin.clear();

Nach diesem Aufruf können Sie einen weiteren Leseversuch unternehmen.

2voto

Matthew Scharley Punkte 121038

EOF bedeutet, dass STDIN (auch bekannt als cin ) wurde geschlossen. Geschlossen bedeutet, dass er nicht mehr verwendet werden kann.

Abgesehen davon denke ich, dass es möglich ist, einen anderen Stream für die Eingabe zu öffnen, aber die bessere und normalere Lösung ist es, die Ein- und Ausgabeverarbeitung zu verbessern und dem Benutzer die Möglichkeit zu geben, ein Token einzugeben, das besagt, dass keine Eingaben mehr angenommen werden.

1voto

Martin York Punkte 245363

Es sieht so aus, als würden Sie Windows verwenden (sonst wären Sie auf der Konsole und das Fenster würde sich nicht schließen). Sie haben zwei Möglichkeiten.

  • Führen Sie die Anwendung über die Befehlszeile aus:
    • Starten Sie cmd. Wechseln Sie in das richtige Verzeichnis. Führen Sie dann den Befehl aus.
      Die Ausgabe auf der Konsole erfolgt korrekt und das Fenster wird nicht geschlossen.
  • Verwenden Sie eine andere Methode, um das Schließen des Fensters zu verhindern
    • Der einfachste Weg ist Pause.
      system("Pause")
  • Wenn Sie den Eingabestrom nicht beenden, können Sie ihn zurücksetzen.
    • d.h.. Wenn Sie einen Text eingeben, der den Operator>> zum Scheitern bringt, wird das Fehlerbit gesetzt.
      Sie können das Fehlerbit mit cin.clear() zurücksetzen
      Dies wird wahrscheinlich nicht funktionieren, wenn Sie den Stream mit ctrl-Z schließen
  • Beachten Sie, wenn Sie versuchen, cin >> pause; zu verwenden (wobei pause ein char oder etwas anderes ist)
    Vergewissern Sie sich, dass der Stream leer ist, indem Sie cin.ignore() verwenden, sonst wird die Pause nicht ausgeführt
    da der Code nach dem Lesen der Daten einfach fortgesetzt wird

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X