我需要将结构中包含的数据写入二进制文件。

假设给定的结构

struct data {
unsigned char sig;
int reserved;
}

我希望能够简单地将此结构的内容输出到文件中。

我试图用这个

fstream out("C:\\somepath", ios::out | ios::app | ios::binary);
data writedata;
writedata.sig = 'BM';
writedata.reserved = NULL;
out.write((char*)&writedata, sizeof(writedata));
out.close();

我期望输出为(使用32位编译器(十六进制为4字节,以十六进制表示)):

42 4D 00 00 00 00

但这不是印刷的内容。

有人可以解释为什么它不起作用以及修复它所需的步骤吗?

谢谢。

===============>>#1 票数:2 已采纳

首先, 'BM'是两个字节,不能装入单个unsigned char'BM'可能被编译器视为多字节文字,这可能不是您想要的)。

然后,编译器可以自由地在结构内部添加填充以使其与正确的单词边界对齐; 在x86上,正确的成员资格保证更好的读取性能;在其他体系结构上,如果对齐错误,则会出现硬件异常。

例如,在您的情况下,在32位x86上,结构的二进制布局将是sig一个字节,填充的三个字节,然后是reserved int (为了获得最佳访问速度,它将在4字节边界对齐) 。

没有避免填充的标准方法。 您必须诉诸于编译器特有的技巧。 在VC ++上,您必须使用#pragma pack ,g ++和clang也受支持,尽管它们的“本机”方式是使用__attribute__(packed)

顺便说一句,如果您必须向文件中写入“便携式”文件格式(例如您尝试编写的DIB),请始终使用固定大小的整数类型(来自stdint.h ),并准备好处理字节序问题。计划移植到其他架构。

===============>>#2 票数:0

我看到的编译器错误/警告:

  1. 失踪; data定义的末尾。
  2. 评估'BM'是错误的。 它必须是单个字符。
  3. NULL分配给data.reserved 您应该做到:

     data.reserved = 0; 

如果要最小化磁盘上文件占用的空间,请分别写入结构的每个字段。

out.write((char*)&writedata.sig, sizeof(writedata.sig));
out.write((char*)&writedata.reserved, sizeof(writedata.reserved));

我注意到的另一件事是,您正在使用ios::app标志打开文件。 它追加到现有文件。 你是这个意思吗? 如果不是,则可以删除该标志。

  ask by Jason Mills translate from so

未解决问题?本站智能推荐:

1回复

编写二进制C ++错误

我在C ++中有以下代码来编写二进制文件。 它输出文件,但是当我打开它时。 我看到它是ASCII格式。 我究竟做错了什么 ? 如何获取字符串消息以二进制形式保存到文件中?
1回复

在C ++中编写二进制文件时如何设置精度?

我需要将.pcd格式的数据转换为.bin格式(数据是激光雷达点云)。 因此,我试图以精确的顺​​序将数据写入行对齐的顺序。 但是我完全可以设置精度。 进行转换后,我读取了.bin文件。 数据仍然不是预定义的精度格式。 这是代码: 如您所见,将值写入float32中的二进制文件(假设,在阅读了一些
1回复

编写和读取二进制文件以填充矢量-C ++

我正在一个涉及二进制文件的项目中。 因此,我开始研究二进制文件,但仍然对如何从我之前编写的二进制文件中写入和填充矢量感到困惑 这是代码:用于编写。 这是阅读代码: 我不知道我是否正确地写入文件,这只是一个测试,所以我不会弄乱我的主文件,而不是写数字,我需要保存存储在向量中
1回复

使用用C编写的fortran二进制文件读取

我知道这可能不是一个很聪明的问题,但是我有一个用C编写的代码可以生成一个二进制文件,并且我必须使用Fortran从该文件中读取数据。 我对C并不是很熟悉,但是我试图提出一个解决方案。 这是用C程序编写的文件的方式 在这里,我将尝试尝试使用Fortran进行阅读 但是问题是
4回复

在C ++中读取\\写入结构化二进制文件

我想读取\\写入具有以下结构的二进制文件: 该文件由“ RECORDS”组成。 每个“记录”具有以下结构:我将使用第一个记录作为示例 (红色)起始字节:0x5A(始终为1字节,固定值为0x5A) (绿色)LENGTH个字节:0x00 0x16(总是2个字节,值可以从“
1回复

在C ++ 11中定义二进制文件的结构

由于我必须使用二进制文件很多,我想有一个更抽象的方法来做到这一点,我必须一遍又一遍地执行相同的循环: 写一个标题 以给定的顺序写出不同类型的块(具有不同的值集) 写一个可选的结束标题 现在我想在小构建块中解决这个问题,想象一下,如果我可以编写类似DTD对于XML
2回复

C ++ / Python中对象和结构的二进制文件结构

我对二进制数据文件有一个简单的(也许很愚蠢的)问题。 如果使用简单类型(int / float / ..),则很容易想象二进制文件的结构(一系列浮点数,每个浮点数使用固定的字节数写入)。 但是结构,对象和功能呢? 关于变量名称/属性/方法的写入顺序,每种语言是否都存在某种形式的约定,如果这
1回复

使用Python“cPickle.load”加载C ++编写的二进制文件时的EOFError

我使用C ++ fwrite写了一个二进制文件,并尝试使用cPickle.load来加载这个文件。 但是我遇到了错误 我的C ++写文件代码是 我的Python加载代码是 请帮助解决这个问题。 谢谢!
2回复

使用C ++ / QT在二进制文件中编写法语字符

我在c ++中有一个二进制文件读/写模块。 该语言对于英语很好用,但无法阅读法语字符集。 我需要进行哪些更改? 是否需要指定任何特殊的编码类型? (我可以访问c ++ std libs和qt 4.7 lib函数)。
1回复

C ++编写和读取二进制文件中的双精度矩阵

在上一个问题之后出现了一个新问题 : 我扩展了代码以执行矩阵二进制文件I / O,并且在测试简单的读写操作时,我仅检索到矩阵的第一行... 我没有找到错误,这是新代码: 预先感谢