C++ 用C+编写二进制文件+;

C++ 用C+编写二进制文件+;,c++,binary,C++,Binary,我有一个设备,它向我发送uint32\t类型的二进制数据。我想把数据保存到一个二进制文件中。这是我的密码: #include<iostream> #include<fstream> #include <cstdlib> using namespace std; int main() { ofstream myFile ("data2.bin", ios::out | ios::binary); bool buffer[32]; for

我有一个设备,它向我发送uint32\t类型的二进制数据。我想把数据保存到一个二进制文件中。这是我的密码:

#include<iostream>
#include<fstream>
#include <cstdlib>

using namespace std;

int main()
{
   ofstream myFile ("data2.bin", ios::out | ios::binary);

   bool buffer[32];

   for (int k = 0; k<100; k++)
   {
      for (int i = 0; i<32;i++) 
   {
     buffer[i] = (bool)rand()%2;
   }
   myFile.write ((char*)&buffer, 32);
  }
   myFile.close();
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
流myFile(“data2.bin”,ios::out | ios::binary);
布尔缓冲区[32];

对于(int k=0;kA
bool
需要一个字节。检查
sizeof(bool)
,您会发现它等于1。因此数组长度为32字节,您要写入它100次,因此为3.2kB

如果要存储位数组,需要使用与
bool
数组不同的内容。您有许多选项:

  • 使用字节、整数或任何已知大小的数组,并显式打开所需的位。然后存储该数组

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstdint>
    
    using namespace std;
    
    int main()
    {
      ofstream myFile ("data2.bin", ios::out | ios::binary);
    
      uint32_t buffer;
    
      for (int k = 0; k<100; k++) {
        buffer = 0;
        for (int i = 0; i<32; i++) {
          buffer <<= 1;
          buffer |= (bool)(rand()%2);
        }
        myFile.write((char*) &buffer, sizeof(buffer));
      }
      myFile.close();
      return 0;
    }
    

  • 当然,在这两种情况下,您都会将字节输出到文件中。在第二种情况下,位数必须是8的倍数。

    您写入的是100乘以32字节。为什么您认为它应该是0.4kB?我缺少什么了吗?---哦,我明白了……32 bools通常是32字节。unit32是一种32位数据类型,在8位字节中是4字节。那么,它是什么呢将uint_32t写入二进制文件最安全的方法是什么?你没有告诉我们你期望的格式。“据我所知,二进制文件对每个布尔变量使用一位”你从哪里听说的?
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <bitset>
    
    using namespace std;
    
    int main()
    {
      ofstream myFile ("data2.bin", ios::out | ios::binary);
    
      bitset<32> buffer;
    
      for (int k = 0; k<100; k++) {
        for (int i = 0; i<32; i++) {
          buffer[i] = (bool)(rand()%2);
        }
        myFile.write((char*) &buffer, 32/8);
      }
      myFile.close();
      return 0;
    }