Lesen von binären Daten von std::cin
Was ist der einfachste Weg, um read binary (nicht formatiert) Daten aus std::cin
entweder in einem string
oder eine stringstream
?
Warum nicht öffnen Sie ein ifstream mit "/dev/stdin" im Binär-Modus?
Würde nicht funktionieren, auf alles, das nicht Unix.
Siehe auch die Diskussion mit
Würde nicht funktionieren, auf alles, das nicht Unix.
Siehe auch die Diskussion mit
std::freopen
(aber es sieht irgendwie hacky). Es wäre schön, wenn jemand eine kanonische Antwort mit Beispielen für Linux, OS X, Solaris und Windows.InformationsquelleAutor Allan | 2011-09-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::cin
ist nicht geöffnet mit ios_binary. Wenn Sie verwenden müssen, cin, dann brauchen Sie, um Sie erneut zu öffnen, die nicht Teil des standard.Einige Ideen hier: http://compgroups.net/comp.unix.programmer/How-can-I-reopen-std-cin-and-std-cout-in-binary-mode.
Sobald es Binär, können Sie
cin.read()
zum Lesen von bytes. Wenn Sie wissen, dass in Ihrem system gibt es keinen Unterschied zwischen text-und binary (und Sie nicht brauchen, um tragbar sein), dann können Sie einfach Lesen ohne sich sorgen zu machen.InformationsquelleAutor Lou Franco
Für windows, die Sie verwenden können, die
_setmode
- Funktion in Verbindung mitcin.read()
, wie bereits erwähnt.Siehe Lösung Quelle hier: http://talmai-oliveira.blogspot.com/2011/06/reading-binary-files-from-cin.html
_setmode(_fileno(stdin), _O_BINARY);
undvector<char> v(static_cast<size_t>(len), 0); cin.read(&v[0], len);
Sie brauchen, umfcntl.h
undio.h
um dies zu tun.InformationsquelleAutor Mikhail
cin.read
speichert eine Feste Anzahl von bytes, ohne jegliche Logik auf der Suche für das Trennzeichen des Typs, @Jason erwähnt.Allerdings kann es immer noch sein, übersetzungen aktiv auf den stream, wie die CRLF -> NL, so ist es noch nicht ideal ist, für binäre Daten.
InformationsquelleAutor Ben Voigt
Auf ein Unix/POSIX-system verwenden, können Sie die
cin.get()
- Methode zum Lesen von byte-by-byte und speichern Sie die Daten in einem container wie einestd::vector<unsigned int>
verwenden, oder Sie könnencin.read()
um zu Lesen, eine Feste Anzahl von bytes in einen Puffer. Sie können auchcin.peek()
zu prüfen, ein Ende-der-Daten-stream-Indikatoren.Beachten Sie zu vermeiden, mit den
operator>>
überlast für diese Art von Betrieb ... mitoperator>>
verursachen Brüche auftreten, wenn ein Trennzeichen zu beobachten, und es wird auch entfernen, die Abgrenzung von Zeichen aus dem stream selbst. Dies würde auch jede Binär-Werte, die äquivalent sind, um ein Leerzeichen, Tabulator, etc. Damit die binären Daten, die Ihr am Ende das speichern vonstd::cin
mit dieser Methode wird nicht der Eingabe entsprechen binären Datenstrom (byte-für-byte.cin
ist immer noch im text-Modus. Das wird wahrscheinlich keine Rolle für Unix-ähnliche Systeme, aber unter Windows, zum Beispiel, jederCR LF
Zeilenende wird noch übersetzt werden zu einer einzigen'\n'
Charakter.Okay, danke für die info ... klärte meine Kommentare dann ...
InformationsquelleAutor Jason
Alle vordefinierten iostream-Objekte sind verpflichtet, die gebunden werden, um den entsprechenden C-Ströme:
http://eel.is/c++Entwurf/schmal.stream.Objekte
und damit die Methode der Gewinnung von binären Daten ist dasselbe wie für C:
https://stackoverflow.com/a/1599093/6049796
InformationsquelleAutor Euri Pinhollow
cplusplus.com:
Als Lou Franco wies darauf hin, std::cin nicht geöffnet ist mit std::ios_base::binary, aber eine dieser Funktionen könnten Sie schließen, um das Verhalten, die Sie suchen.
might get you close to
: es könnte auch Sie in Schwierigkeiten bringen, weil die OS/Bibliothek ist berechtigt, line-end Umbauten, die potenziell korrupte binären Daten. Es ist nicht mir klar, dass Sie Lesen 'Lesen'/'readsome' oder auch direkt aus *rdbuf() (der stream-Puffer) ist nicht schon umgewandelt in dieser Art und WeiseInformationsquelleAutor luke
Mit windows/mingw/msys/bash, wenn Sie brauchen, um Rohr verschiedene Befehle, die mit Binär-streams in zwischen, müssen Sie zu manipulieren std::cin und std::cout als Binär-streams.
Den _setmode Lösung von Michael funktioniert einwandfrei.
Unter Verwendung von MinGW, das neaded Header sind die folgenden:
InformationsquelleAutor Yves Lhuillier