c++ - 如何将位域写入二进制文件
问题描述
假设我有一个总计为 32 位的位域。我想将这些输出到二进制文件中,我们称之为“binary.bin”。我如何在不崩溃视觉工作室的情况下解决这个问题?
我从以前的谷歌搜索中发现的关于此类事情的信息很少,我不知道该怎么做。通常的反应是“没有人使用位域 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 时它不喜欢它
我很感激你能给我的任何帮助
解决方案
我注意到您发布的代码中有两个问题。
问题1。
您需要一个对象来将其内容保存到文件中,而不是类型及其成员。
从这个角度来看,这个表达bitfield.b1
是不正确的。你需要:
bitfield obj;
之后,您可以使用obj.b1
来引用成员。
问题2:
该语言不允许您获取位域成员的地址。请参阅是否有无法获取地址的变量?
解决方案
创建一个对象并将整个对象保存到文件中,而不仅仅是一个位字段。
std::ofstream ofile("binary.bin", std::ios::binary);
bitfield obj;
ofile.write(retinterpret_cast<char*>(&obj), sizeof(obj));
推荐阅读
- reporting-services - 如何在 SSRS 的单个 Tablix 区域中使用多个数据集来处理多对多关系?
- ios - CollectionView 委托和数据源出口在界面生成器中被忽略,但在硬编码时工作。为什么?
- google-chrome - 如何从命令行启用 chrome 功能?
- ruby-on-rails - 在 Rails 5.1 中,如何为 has_many 和 belongs_to 关联编写查找器方法?
- fullcalendar - fullcalendar 插件无法在某些远程设备上呈现
- sql - 如何显示来自不同列的具有 twho 条件的一些记录
- javascript - 使用 ReactDOM.render 渲染元素时如何访问 redux 存储?
- python - Atom running Hydrogen Package - 没有可用的内省
- google-cloud-platform - Google Cloud SQL 维护时段
- java - 递归方法查找数字中出现的数量