Каков самый простой способ чтения двоичных (неформованных) данных из 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()
для чтения байтов. Если вы знаете, что в вашей системе нет разницы между текстом и двоичным кодом (и вам не нужно быть переносимым), тогда вы можете просто использовать чтение, не беспокоясь.
Ответ 2
Для окон вы можете использовать функцию _setmode
в сочетании с cin.read()
, как уже упоминалось.
_setmode(_fileno(stdin), _O_BINARY);
cin.read(...);
Смотрите здесь источник решения: http://talmai-oliveira.blogspot.com/2011/06/reading-binary-files-from-cin.html
Ответ 3
cin.read
будет хранить фиксированное количество байтов без логического поиска разделителей типа, упомянутого @Jason.
Тем не менее, в потоке все еще могут быть переводы, такие как CRLF → NL, поэтому он по-прежнему не идеален для двоичных данных.
Ответ 4
В системе Unix/POSIX вы можете использовать метод cin.get()
для чтения побайтно и сохранять данные в контейнер, например std::vector<unsigned int>
, или вы можете использовать cin.read()
, чтобы читать фиксированное количество байтов в буфер. Вы также можете использовать cin.peek()
для проверки индикаторов конца потока данных.
Имейте в виду, чтобы избежать использования перегрузки operator>>
для этого типа операций... использование operator>>
приведет к возникновению разрывов всякий раз, когда наблюдается символ разделителя, и он также удалит разделительный символ из самого потока, Это будет включать в себя любые двоичные значения, которые эквивалентны пробелу, вкладке и т.д. Таким образом, двоичные данные, которые вы сохраняете в конце std::cin
с помощью этого метода, не будут соответствовать байтовому байту ввода-байта.
Ответ 5
Неформатированный ввод
Большинство других функций-членов 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" отключает это преобразование, чтобы вы могли правильно читать двоичные данные.