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

C++写入unsigned int值10时出现额外字节的原因排查

问题根源:文本模式下的换行符自动转换

你遇到的额外字节0xD(回车符),本质是因为你的文件根本没以二进制模式打开,导致文本模式下的换行符转换搞了鬼。

为什么二进制模式没生效?

看你打开文件的代码:

std::ofstream file("test.bin", std::ios_base::out, std::ios_base::binary);

std::ofstream的构造函数中,第二个参数是打开模式的位掩码组合,第三个参数是可选的分配器参数(默认是std::allocator<char>)。你把std::ios_base::binary传到第三个参数的位置,它完全不会被当作打开模式处理——也就是说,你的文件实际是用默认的文本模式打开的!

文本模式的换行符转换是怎么影响你的数据的?

在Windows系统的文本模式下,当程序写入ASCII换行符(0x0A,也就是十进制的10)时,系统会自动将其替换为0x0D 0x0A(回车+换行)的组合。

你的data2是unsigned int data2 = 10,在小端字节序的系统中,它在内存中的字节序列是:0x0A 0x00 0x00 0x00。当以文本模式写入时,第一个字节0x0A被替换成了0x0D 0x0A,原本的4字节数据就变成了5字节:0x0D 0x0A 0x00 0x00 0x00——这就是你看到的额外0xD字节的来源,同时也导致后续的data3数据被偏移了一个字节。

修复方案

把打开模式用按位或|合并成一个参数,正确启用二进制模式:

// 显式组合out和binary模式
std::ofstream file("test.bin", std::ios_base::out | std::ios_base::binary);

或者更简洁的写法(因为ofstream默认就是out模式):

std::ofstream file("test.bin", std::ios_base::binary);

这样打开文件后,程序会以纯二进制模式写入数据,不会做任何字符转换,你的四个unsigned int会被准确写入16个字节,十六进制dump结果就会是正常的:

08 00 00 00 09 00 00 00 0A 00 00 00 0B 00 00 00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:56:21