Чтение двоичных данных из 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 беспокоясь.
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 " отключает это преобразование, чтобы вы могли правильно читать двоичные данные.
Неформатированный ввод
большинство других функций-членов 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>