从std :: cin读取二进制数据

时间:2011-09-28 18:13:21

标签: c++ stream binary stdin cin

std::cin的二进制(非格式化)数据读入stringstringstream的最简单方法是什么?

7 个答案:

答案 0 :(得分:9)

不使用ios_binary打开

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禁用此转换,以便您可以正确读入   二进制数据。

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

答案 5 :(得分:0)

cplusplus.com

  
      
  • 未格式化的输入

         

    istream的大多数其他成员函数   class用于执行未格式化的输入,即没有解释   在角色上做出了输入。这些成员函数可以   从输入字符中获取确定数量的字符   序列( getgetlinepeekreadreadsome )...

  •   

正如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>