Wie liest man bis EOF von cin in C ++?
Ich bin die Kodierung eines Programms, liest Daten direkt aus den Benutzereingaben und Frage mich, wie konnte ich (ohne Schleifen) alle Daten Lesen, bis ein EOF-Zeichen von der Standardeingabe. Ich überlegte, mit cin.get( input, '\0' )
aber '\0'
ist wirklich nicht das EOF-Zeichen, das nur liest, bis EOF oder '\0'
je nachdem, was zuerst kommt.
Oder ist die Verwendung von Schleifen die einzige Möglichkeit, es zu tun? Wenn ja, was ist der beste Weg?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur so können Sie Lesen, eine variable Menge an Daten von stdin ist die Verwendung von Schleifen. Ich habe immer gefunden, dass die
std::getline()
- Funktion funktioniert sehr gut:Standardmäßig getline() liest, bis ein Zeilenumbruch. Sie können angeben, dass eine alternative Beendigung Charakter, aber EOF ist nicht selbst ein Zeichen, damit Sie nicht einfach machen, die einen Aufruf von getline().
InformationsquelleAutor der Antwort trotterdylan
Sie es tun können, ohne explizite Schleifen mithilfe von stream-Iteratoren. Ich bin mir sicher, dass es benutzt eine Art Schleife intern.
InformationsquelleAutor der Antwort KeithB
Verwendung von Schleifen:
Ressource
InformationsquelleAutor der Antwort Degvik
Nachdem die Erforschung KeithB die Lösung mit
std::istream_iterator
entdeckte ich diestd:istreambuf_iterator
.Test-Programm zum Lesen von allen weitergeleiteten Eingabe in einen string, dann Schreibe es wieder:
InformationsquelleAutor der Antwort
Wahrscheinlich einfachste und in der Regel effizient:
Falls erforderlich, verwenden Sie Strom von anderen Arten wie
std::ostringstream
als Puffer anstelle der standard-Ausgabe-stream hier.InformationsquelleAutor der Antwort
Können Sie die std::istream::getline() (oder vorzugsweise die version, die funktioniert auf std::string) - Funktion, um eine gesamte Linie. Beide Versionen ermöglichen Ihnen das festlegen der delimiter (Ende-Zeile-Zeichen). Der Standard für die string-version ist '\n'.
InformationsquelleAutor der Antwort luke
Traurige Randnotiz: ich habe mich für C++ - IO-im Einklang mit boost-basierten code. Aus den Antworten auf diese Frage, die ich wählte
while (std::getline(std::cin, line))
. Mit g++ version 4.5.3 (-O3) in cygwin (mintty) habe ich 2 MB/s Durchsatz. Microsoft Visual C++ 2010 (/O2) 40 MB/s für den gleichen code.Nach umschreiben der IO zu reinen C
while (fgets(buf, 100, stdin))
den Durchsatz sprang zu 90 MB/s in beide getestet Compiler. Das macht einen Unterschied für alle Eingaben, die größer als 10 MB...InformationsquelleAutor der Antwort
InformationsquelleAutor der Antwort
Warten, verstehe ich dich richtig? Bist du mit cin für die Tastatureingabe wird, und Sie möchten aufhören zu Lesen die Eingabe, wenn der Benutzer das EOF-Zeichen? Warum sollte der Benutzer jemals geben Sie in das EOF-Zeichen? Oder meinst du du willst aufhören zu Lesen aus einer Datei an die EOF?
Wenn Sie tatsächlich versuchen, zu verwenden cin zum Lesen ein EOF-Zeichen, dann, warum nicht geben Sie nur den EOF als Trennzeichen?
Wenn du meinst aufhören zu Lesen aus einer Datei an die EOF, dann verwenden Sie einfach getline und wieder einmal geben Sie die EOF-Zeichen als Trennzeichen.
InformationsquelleAutor der Antwort
Ist eine option, um einen verwenden Sie einen Behälter, z.B.
und redirect alle Eingang in diese Sammlung, bis
EOF
empfangen wird, d.h.Jedoch die verwendeten Behälter müssen möglicherweise Speicher neu zuzuteilen, zu oft, oder Sie werden am Ende mit einem
std::bad_alloc
Ausnahme, wenn Ihr system wird aus dem Speicher. Um diese Probleme zu lösen, könnten Sie reserve einen festen BetragN
Elemente und verarbeiten diese Menge von Elementen, die isoliert, d.h.InformationsquelleAutor der Antwort