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

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

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

Для окон вы можете использовать функцию _setmode в сочетании с cin.read() , как уже упоминалось.

 _setmode(_fileno(stdin), _O_BINARY); cin.read(...); 

См. Источник решения здесь: http://talmai-oliveira.blogspot.com/2011/06/reading-binary-files-from-cin.html

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

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

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

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

cplusplus.com :

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

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

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

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

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

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

 #include  #include  

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

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

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

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

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

freopen(NULL, "rb", stdin);

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

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

  • Java: Синтаксис и смысл за «[B @ 1ef9157»? Binary / адрес?
  • Преобразование шестнадцатеричной строки (hex) в двоичную строку
  • Захват двоичного вывода из Process.StandardOutput
  • Как подсчитать количество заданных битов в 32-битовом целое?
  • Преобразование двоичной строки в целое число
  • Можно ли использовать бинарный литерал в C или C ++?
  • Преобразование двоичной строки в байтовый массив
  • Определение типа двоичного / текстового файла в Java?
  • Быстрая версия функции dec2bin для преобразования многих элементов?
  • Почему мы используем Base64?
  • Преобразование строки из 1s и 0s в двоичное значение
  • Давайте будем гением компьютера.