Чтение двоичных данных из std::cin

каков самый простой способ чтения двоичных (неформатированных) данных из std::cin на string или stringstream?

7 ответов


std::cin не открывается с помощью ios_binary. Если вы должны использовать cin, вам нужно снова открыть его, что не является частью стандарта.

некоторые идеи здесь: http://compgroups.net/comp.unix.programmer/How-can-I-reopen-std-cin-and-std-cout-in-binary-mode.

Как только он двоичный, вы можете использовать cin.read() читать байт. Если вы знаете, что в вашей системе нет разницы между текстом и двоичным (и вам не нужно быть портативным), то вы можете просто использовать read беспокоясь.


для Windows, вы можете использовать


cin.read будет хранить фиксированное количество байтов без логического поиска разделителей типа, упомянутого @Jason.

однако в потоке все еще могут быть активные переводы, такие как CRLF -> NL, поэтому он все еще не идеален для двоичных данных.


в системе Unix/POSIX, вы можете использовать cin.get() метод для чтения байт за байтом и сохранения данных в контейнер, такой как std::vector<unsigned int>, или вы можете использовать cin.read() для чтения фиксированного количества байтов в буфер. Вы также можете использовать cin.peek() для проверки конца потока данных показателей.

имейте в виду, чтобы избежать использования operator>> перегрузка для этого типа деятельности ... используя operator>> будет вызывать разрывы, когда наблюдается символ разделителя, и он также будет удалите символ-разделитель из самого потока. Это будет включать любые двоичные значения, эквивалентные пробелу, вкладке и т. д. Таким образом, двоичные данные, которые вы в конечном итоге храните из std::cin использование этого метода не будет соответствовать входному двоичному потоку байт за байтом.


все предопределенные объекты iostream обязаны быть привязаны к соответствующим потокам C:

объект cin контроль ввода из буфера потока, связанного с объектом stdin, объявленное в <cstdio>.

http://eel.is/c ++ черновик/узкий.ручей.объекты

и таким образом, способ получения двоичных данных такой же, как для C:

в принципе, лучшее, что вы можете действительно сделать это:

freopen(NULL, "rb", stdin);

это откроет stdin для того же входного потока, но в двоичном формате режим. В обычном режиме чтение из stdin в Windows преобразуется \r\n (Windows newline) для одного символа ASCII 10. С помощью режим" rb " отключает это преобразование, чтобы вы могли правильно читать двоичные данные.

https://stackoverflow.com/a/1599093/6049796


cplusplus.com:

  • Неформатированный ввод

    большинство других функций-членов istream класс используется для выполнения неформатированного ввода, т. е. интерпретация отсутствует сделано на символах, полученных из ввода. Эти функции-члены могут получить определенное количество символов из входного символа последовательность (get, getline, peek, читать, readsome)...

Как отметил Лу Франко, std::cin не открывается с помощью std::ios_base:: binary, но одна из этих функций может приблизить вас к поведению, которое вы ищете.


С windows/mingw/msys / bash, если вам нужно передавать различные команды с двоичными потоками между ними, вам нужно манипулировать std::cin и std::cout как двоичные потоки.

решение _setmode от Михаила работает отлично.

используя MinGW, заголовки neaded следующие:

#include <io.h>
#include <fcntl.h>