fwrite 4 字符数组,将写入 7 而不是 4
fwrite 4 char array, would write 7 instead of 4
源代码:
main(void) {
unsigned char tmp[5] = {10, 10, 180, 255, 40};
FILE *ff = fopen("aa.bin", "w");
fwrite(&tmp, sizeof(char), 5, ff);
}
当执行并看到文件 aa.bin 的十六进制内容时,它看起来像这样:
0D 0A 0D 0A B4 FF 28
为什么10的值写成两个字节(0D 0A)而char类型只占1个字节。 (0D) 是什么意思?
我正在使用 G++ 编译器(Windows 上的 MinGW)和 cpp11。
在ASCII中,10是换行的字符编码'\n'
。
由于您在非二进制模式下运行,换行符被解释为实际换行符,标准库将其转换为特定于平台的换行符序列,即在 Windows 系统上,CR- LF(回车 return 和换行)或十六进制的 0D 0A
。
尝试以二进制模式打开文件以跳过标准库的高级解释并仅对字节而不是字符进行操作。为此目的使用 "wb"
而不是 "w"
.
顺便说一句,使用 tmp
而不是 &tmp
。在某些情况下,数组会隐式转换为指针,包括手头的那个,它 decays。 &tmp
是指向数组的实际指针,在本例中为 unsigned char (*)[5]
。虽然在您的特定情况下两者是等效的,但这可能会带来问题。
源代码:
main(void) {
unsigned char tmp[5] = {10, 10, 180, 255, 40};
FILE *ff = fopen("aa.bin", "w");
fwrite(&tmp, sizeof(char), 5, ff);
}
当执行并看到文件 aa.bin 的十六进制内容时,它看起来像这样:
0D 0A 0D 0A B4 FF 28
为什么10的值写成两个字节(0D 0A)而char类型只占1个字节。 (0D) 是什么意思?
我正在使用 G++ 编译器(Windows 上的 MinGW)和 cpp11。
在ASCII中,10是换行的字符编码'\n'
。
由于您在非二进制模式下运行,换行符被解释为实际换行符,标准库将其转换为特定于平台的换行符序列,即在 Windows 系统上,CR- LF(回车 return 和换行)或十六进制的 0D 0A
。
尝试以二进制模式打开文件以跳过标准库的高级解释并仅对字节而不是字符进行操作。为此目的使用 "wb"
而不是 "w"
.
顺便说一句,使用 tmp
而不是 &tmp
。在某些情况下,数组会隐式转换为指针,包括手头的那个,它 decays。 &tmp
是指向数组的实际指针,在本例中为 unsigned char (*)[5]
。虽然在您的特定情况下两者是等效的,但这可能会带来问题。