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

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

Ответ 1

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() для чтения байтов. Если вы знаете, что в вашей системе нет разницы между текстом и двоичным кодом (и вам не нужно быть переносимым), тогда вы можете просто использовать чтение, не беспокоясь.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

cplusplus.com:

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

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

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

Ответ 6

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

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

Используя MinGW, необработанные заголовки выглядят следующим образом:

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

Ответ 7

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

Объект cin управляет входом из буфера потока, связанного с объектом stdin, объявленным в.

http://eel.is/c++draft/narrow.stream.objects

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

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

freopen(NULL, "rb", stdin);

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

fooobar.com/info/316714/...