在C ++中使用ofstream将32位二进制数据写入文件

时间:2014-04-03 15:58:26

标签: c++ rhapsody

我试图只将uint32_t数据写入.bin文件。我首先打开一个文件流,我声明它是一个二进制文件流。

  `hartInStream.open (hartFileToWrite.c_str(), std::ifstream::binary);
   if(!hartOutStream.is_open())
        {
        printf("Something in outstream went wrong.\n");  
        }
   else 
        {
        printf("Yippy! it outstream worked!\n");  
        printf("---------Starting to read-------------\n");}`

接下来,我将我正在尝试编写的数据(在本例中为uint32_t“data”)打印出来,然后将其写入文件流的末尾。

printf(" Reading %lu from HART at %d-%d-%d\n", data, (int)addr1, (int)addr2, (int)addr3 );

最后我追加数据

hartOutStream<<data;

我知道我应该写0x00 0x00 0x01 0x00(256)作为前4个字节,但我正在写 32 35 36这是ascii章程的十六进制等效值为256.(使用HxD文件查看器)

我怀疑问题出在&lt;&lt;运算符,它将其强制转换为ascii。我尝试过类型转换,atoi()函数但似乎没什么用。有谁知道这有什么问题?

谢谢

2 个答案:

答案 0 :(得分:5)

ofstream f;
f.open("my.bin",std::ofstream::binary);
uint32_t data=0x00000100;
f.write((char*)&data,sizeof(data));

答案 1 :(得分:1)

<<运算符格式化为文本。如果你想要二进制格式, 你必须手动格式化为std::vector<char>,然后 用std::ostream::write()写出来。类似的东西:

std::vector<char> buf;
buf.push_back( (data >> 24) & 0xFF );
buf.push_back( (data >> 16) & 0xFF );
buf.push_back( (data >>  8) & 0xFF );
buf.push_back( (data      ) & 0xFF );
hartOutStream.write( buf.data(), buf.size() );

(如果您使用的是较旧的C ++,则可能需要编写 &buf[0],而不是buf.data()。)