【问题标题】:How to Write Bitfield to a Binary File如何将位域写入二进制文件
【发布时间】:2019-06-21 16:23:53
【问题描述】:

假设我有一个总计为 32 位的位域。我想将这些输出到二进制文件中,我们称之为“binary.bin”。如何在不崩溃 Visual Studio 的情况下解决这个问题?

我从以前的谷歌搜索中发现的关于此类事情的信息太少了,我不知道该怎么办。通常的反应是“没有人使用位域 lmao”,但事实证明我需要使用位域来工作。

我知道位域有时低于 8 位,因此无法放入字节中,这使得处理变得困难,但这并不意味着我不能将 32 位位域放入二进制文件,对吧?

我在其他地方找到了有关打印到二进制文件的信息,希望它可以工作。

struct bitfield {

    unsigned int     b1 : 22; 
    unsigned int     b2 : 4;
    unsigned int     b3 : 5;
    unsigned int     b4 : 1; 
};
int main(){

    std::ofstream ofile("binary.bin", std::ios::binary);
    ofile.write((char*)&bitfield.b1, sizeof(unsigned int));

    return 0;
}

这甚至不起作用,我不知道为什么,当我说 bitfield.b1 时它不喜欢它

如果你能给我任何帮助,我将不胜感激????

【问题讨论】:

  • “这根本行不通” 不是一个简明的问题描述。 Edit你的问题请澄清。

标签: c++ io binary bit-fields


【解决方案1】:

我注意到您发布的代码中有两个问题。

问题 1。

您需要一个对象来将其内容保存到文件中,而不是类型及其成员。

从这个角度来看,表达式bitfield.b1 是不正确的。你需要:

bitfield obj;

之后,您可以使用obj.b1 引用该成员。

问题2:

该语言不允许您获取位域成员的地址。见Are there any variables whose address can not be obtained?


解决方案

创建一个对象并将整个对象保存到文件中,而不仅仅是一个位域。

std::ofstream ofile("binary.bin", std::ios::binary);
bitfield obj;
ofile.write(retinterpret_cast<char*>(&obj), sizeof(obj));

【讨论】:

    【解决方案2】:

    首先你需要声明一个位域类型的变量,而不仅仅是名为位域的结构体。写入一个 二进制文件:

    bitfield bf;
    ... some value sett
    FILE *f=fopen("binary.bin","wb");
    fwrite(&bf,sizeof(bf),1,f);
    fclose(f);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多