You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中结构体成员逐写与直接写对象的差异及代码实例疑问

C++结构体成员分别写入文件 vs 直接写入结构体对象的差异

首先直接给结论:示例中的两个文件数据完全不一致,而且两种写入方式的处理逻辑有本质区别,下面详细拆解:

一、两个指令的处理逻辑差异

指令1:myfile1 << obj.num1 << obj.abc;

这是C++标准库提供的格式化文本输出,本质是把数据转换成人类可读的字符串形式写入文件:

  • 对于int num1:会把整数的数值转换成对应的ASCII字符串,比如示例中obj是全局结构体,默认零初始化后num1=0,写入的就是字符'0'(ASCII码0x30)。
  • 对于char abc[10]:流输出会从数组首地址开始,逐个输出字符直到遇到'\0'(字符串结束符)为止。因为abc被零初始化全是'\0',第一个字符就是结束符,所以这部分不会输出任何内容。

最终example1.txt里只会有一个字符'0'。

指令2:myfile2.write((char*)&obj, sizeof(obj));

这是二进制原始字节写入,直接把结构体在内存中的完整布局原封不动地写入文件:

  • 它不会做任何格式转换,直接读取obj所在内存地址开始的sizeof(obj)个字节,这里有两个关键细节:
    1. 内存对齐填充:C++编译器为了提升内存访问效率,会给结构体成员之间或末尾添加填充字节。比如你的example结构体,int占4字节,char[10]占10字节,多数编译器会把总大小对齐到16字节(补2个填充字节,全局变量的填充值也是0)。
    2. 原始数据存储:num1=0在内存中是4个连续的0字节;abc数组的10个字节全是0;再加上2个填充的0字节,总共16个字节会被完整写入example2.txt。

二、扩展补充(常见场景差异)

即使给结构体成员赋值非零值,两种方式的差异依然明显:

  • 比如num1=123,abc="hello":指令1会写入字符串"123hello";指令2会写入4字节的123原始字节(比如0x7B 0x00 0x00 0x00)、"hello"的5个字节加5个'\0',再加上填充字节,总共16个原始字节。
  • 二进制写入的文件是不可读的(文本编辑器打开会显示乱码),但读写速度更快,适合存储结构化数据;格式化写入的文件是文本格式,人类可读,但读写时需要做格式转换,效率更低。

内容的提问来源于stack exchange,提问作者Ashwin Balaji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:37:29