2011-01-15 5 views
5

Wie kann ich für eine C++ - Anwendung ein Ende der Datei (EOF) programmgesteuert auf Stdin erzwingen?Wie zwinge ich eof auf stdin?

+0

Wie meinst du 'zwingen EOF auf stdin'? Sie könnten Stdin (oder Cin) schließen. Sie könnten Ihre Schleife einseitig beenden lassen. Sie könnten bis zum Ende der Datei suchen (aber das hilft nicht mit einem Terminal oder einer Pipe als Eingabe). Sie könnten das Problem mit 'freopen()' erzwingen; Standardeingabe neu zuweisen, um von/dev/null oder NUL: zu lesen. –

Antwort

6

Eigentlich können Sie nicht. Solange Sie Daten von stdin lesen können, wurde EOF nicht erreicht, und tatsächlich können Sie es nie erreichen. Sie können die stdin jedoch selbst schließen. Um es zu schließen, dies tun:

fclose(stdin); 

Danach können Sie keine Daten von stdin lesen.

8

Wenn Sie an einem Terminal in einem Unix-ähnlichen System arbeiten, wählen Sie Ctrl-D. In Windows Ctrl-Z.

Edit: Nachdem ich den Wunsch, dies "programmgesteuert" zu tun, habe ich vorgeschlagen, versuchen fclose(stdin). Wenn das irgendwie nicht gut genug ist, könnte es eine verrücktere Idee sein, std::cin.rdbuf() zu verwenden, um den Stream so einzustellen, dass er sich auf etwas anderes als die echte Standardeingabe bezieht, und dann den gewünschten Stream zu machen. Aber das fängt an schlecht zu riechen, als würdest du gegen den Computer kämpfen, also würde ich gerne mehr darüber wissen, was das eigentliche Ziel ist.

+0

Aber das ist aus einer C++ - Anwendung, funktioniert das Senden von Ctrl-D? – WilliamKF

+0

Oh ich sehe "programmatisch" jetzt. Vielleicht können Sie genauer beschreiben, was Sie zu tun versuchen? –

+1

Schreiben Sie einfach 0x1A (der ASCII-Code für Strg + Z) auf stdin. – Tergiver

1

Es gibt eine nette kleine Funktion für jeden Stream, der speziell dafür erstellt wurde.

Es ist Syntax ist so etwas wie:

 stream.setstate(stream.flags) 


So in Ihrem Code können Sie eine einfache Bedingung, die wie etwas auslöst:

 std::cin.setstate(std::cin.eofbit); 


Die Dokumentation für diese ziemlich spärlich, aber es gibt einige auf cppreference.com und cplusplus.com.