将std::cin
的二进制(非格式化)数据读入string
或stringstream
的最简单方法是什么?
答案 0 :(得分:9)
std::cin
。如果你必须使用cin,那么你需要重新打开它,这不是标准的一部分。
这里有一些想法:http://compgroups.net/comp.unix.programmer/How-can-I-reopen-std-cin-and-std-cout-in-binary-mode。
一旦它是二进制文件,您可以使用cin.read()
来读取字节。如果您知道在您的系统中,文本和二进制文件之间没有区别(并且您不需要是可移植的),那么您可以使用read而不必担心。
答案 1 :(得分:7)
对于Windows,您可以将_setmode
函数与cin.read()
结合使用,如前所述。
_setmode(_fileno(stdin), _O_BINARY);
cin.read(...);
请在此处查看解决方案来源:http://talmai-oliveira.blogspot.com/2011/06/reading-binary-files-from-cin.html
答案 2 :(得分:2)
在Unix / POSIX系统上,您可以使用cin.get()
方法逐字节读取并将数据保存到std::vector<unsigned int>
之类的容器中,或者您可以使用cin.read()
为了将一定量的字节读入缓冲区。您还可以使用cin.peek()
检查任何数据流末尾指标。
请注意避免对此类操作使用operator>>
重载...使用operator>>
将导致在观察到分隔符时发生中断,并且还将删除分隔符来自流本身。这将包括任何等价于空格,制表符等的二进制值。因此,使用该方法从std::cin
最终存储的二进制数据将不是逐字节地匹配输入二进制流。
答案 3 :(得分:2)
cin.read
将存储固定数量的字节,而没有任何逻辑搜索@Jason提到的类型的分隔符。
但是,流上可能仍有活跃的翻译,例如CRLF - &gt; NL,所以它仍然不适合二进制数据。
答案 4 :(得分:1)
所有预定义的iostream对象都必须绑定到相应的C流:
对象
cin
控制与stdin
中声明的对象<cstdio>
关联的流缓冲区的输入。
http://eel.is/c++draft/narrow.stream.objects
因此获得二进制数据的方法与C:
相同基本上,你真正做的最好的就是:
freopen(NULL, "rb", stdin);
这将重新打开stdin为相同的输入流,但是以二进制形式 模式。在正常模式下,从Windows上的stdin读取将转换
\r\n
(Windows换行符)单字符ASCII 10.使用 &#34; RB&#34; mode禁用此转换,以便您可以正确读入 二进制数据。
答案 5 :(得分:0)
正如Lou Franco指出的那样,std :: cin不是用std :: ios_base :: binary打开的,但其中一个函数可能会让你接近你正在寻找的行为。
答案 6 :(得分:0)
使用windows / mingw / msys / bash,如果需要在两者之间管理具有二进制流的不同命令,则需要将std :: cin和std :: cout作为二进制流进行操作。
米哈伊尔的_setmode解决方案非常有效。
使用MinGW,带头的标题如下:
#include <io.h>
#include <fcntl.h>