Lee datos binarios de std :: cin

¿Cuál es la forma más fácil de leer datos binarios (no formateados) de std::cin en una string o en un stringstream ?

std::cin no se abre con ios_binary. Si debe usar cin, entonces debe volver a abrirlo, lo cual no es parte del estándar.

Algunas ideas aquí: http://compgroups.net/comp.unix.programmer/How-can-I-reopen-std-cin-and-std-cout-in-binary-mode .

Una vez que es binario, puede usar cin.read() para leer bytes. Si sabes que en tu sistema no hay diferencia entre texto y binario (y no necesitas ser portátil), entonces puedes usar leer sin preocuparte.

Para Windows, puede usar la función _setmode junto con cin.read() , como ya se mencionó.

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

Vea la fuente de la solución aquí: http://talmai-oliveira.blogspot.com/2011/06/reading-binary-files-from-cin.html

cin.read almacenaría un número fijo de bytes, sin ninguna lógica buscando delimitadores del tipo mencionado por @Jason.

Sin embargo, todavía puede haber traducciones activas en la transmisión, como CRLF -> NL, por lo que aún no es ideal para datos binarios.

En un sistema Unix / POSIX, puede usar el método cin.get() para leer byte por byte y guardar los datos en un contenedor como std::vector , o puede usar cin.read() para leer una cantidad fija de bytes en un buffer. También puede usar cin.peek() para verificar si hay indicadores de final de data-stream.

Tenga en cuenta que para evitar el uso de la sobrecarga del operator>> para este tipo de operación … usar el operator>> ocasionará que se produzcan interrupciones siempre que se observe un carácter delimitador, y también eliminará el carácter delimitador de la secuencia en sí. Esto incluiría cualquier valor binario que sea equivalente a un espacio, pestaña, etc. Por lo tanto, los datos binarios que almacena al final de std::cin utilizando ese método no coincidirán con la entrada binaria de flujo byte por byte.

cplusplus.com :

  • Entrada sin formato

    La mayoría de las otras funciones miembro de la clase istream se utilizan para realizar una entrada sin formato, es decir, no se realiza ninguna interpretación de los caracteres obtenidos a partir de la entrada. Estas funciones miembro pueden obtener un determinado número de caracteres de la secuencia de caracteres de entrada ( get , getline , peek , read , readsome ) …

Como señaló Lou Franco, std :: cin no se abre con std :: ios_base :: binary, pero una de esas funciones puede acercarlo al comportamiento que está buscando.

Con windows / mingw / msys / bash, si necesita canalizar diferentes comandos con secuencias binarias intermedias, debe manipular std :: cin y std :: cout como flujos binarios.

La solución _setmode de Mikhail funciona perfectamente.

Con MinGW, los encabezados son los siguientes:

 #include  #include  

Todos los objetos iostream predefinidos están obligados a estar vinculados a los flujos de C correspondientes:

El objeto cin controla la entrada desde un buffer de flujo asociado con el objeto stdin , declarado en .

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

y así el método de obtención de datos binarios es el mismo que para C:

Básicamente, lo mejor que puedes hacer es esto:

freopen(NULL, "rb", stdin);

Esto volverá a abrir stdin para ser el mismo flujo de entrada, pero en modo binario. En el modo normal, la lectura de stdin en Windows convertirá \r\n (nueva línea de Windows) al carácter único ASCII 10. Al usar el modo “rb”, se deshabilita esta conversión para que pueda leer correctamente en los datos binarios.

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