Wie man Cin nach EOF richtig wiederverwendet [Duplikat]C++

Programme in C++. Entwicklerforum
Anonymous
 Wie man Cin nach EOF richtig wiederverwendet [Duplikat]

Post by Anonymous »

Ich erstelle eine kleine CLI in C++ für ein Studentenprojekt und eine der Anforderungen besteht darin, dass einige Befehle die Standardeingabe für ihre Eingabe verwenden können. Wenn der Benutzer beispielsweise echo ohne Argument eingibt, liest das Programm die Benutzereingabe von der Standardeingabe, bis der EOF erreicht ist (es heißt STRG+D auf Unix-ähnlichen Systemen oder STRG+Z unter Windows). Mein Problem ist, dass der Cin nach Erreichen des EOF unbrauchbar wird. Meine aktuelle Lösung verfügt über eine Basisklasse Command, von der die konkreten Befehle wie Echo abgeleitet werden. Die Command-Klasse verfügt über eine Methode, die bei der Befehlsausführung aufgerufen wird:execute(std::istream& in, std::ostream& out, std::ostream& err). Meine Idee ist, nach der Ausführung zu prüfen, ob der Eingabestream des Befehls cin ist, und dann, wenn ja, die Methode cin.clear() aufzurufen, um das EOF-Flag zu löschen. Das funktioniert gut, wenn ich mein Programm unter Windows ausführe, aber wenn ich es unter Linux ausführe, treten Probleme auf. Da ich einen Batch-Befehl implementieren muss, der den CLI-Eingabestream in eine Datei ändert, habe ich einen Stapel von Eingabestreams.

Code: Select all

std::istream& in = getCurrentInput();
std::string line;
if (!std::getline(in, line, '\n')) {
if (m_inputStack.size() > 1) m_inputStack.pop();
else m_running = false;
}
Das Problem besteht darin, dass das Programm auch nach dem Löschen des cin unter Linux diese if-Anweisung eingibt, als ob der Fehler immer noch da wäre. Das Hinzufügen von clearerr(stdin) zusammen mit cin.clear() scheint das Problem zu beheben, aber dieser Ansatz gefällt mir nicht, da er wie C-Code aussieht. Wie kann ich mit diesem Verhalten richtig umgehen, damit es sowohl unter Windows als auch unter Linux funktioniert?
Bearbeiten:
Nach der Überprüfung der Fehlerbits nach der Befehlsausführung und vor dem Löschen ist dies die Ausgabe:
eof: 1 bad: 0 fail: 1
used:

Code: Select all

std::cout

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post