fwrite 4 char数组,会写7而不是4

Osa*_*'ai 7 c++ windows fwrite

源代码:

 main(void) {
  unsigned char tmp[5] = {10, 10, 180, 255, 40};
  FILE *ff = fopen("aa.bin", "w");
  fwrite(&tmp, sizeof(char), 5, ff);
}
Run Code Online (Sandbox Code Playgroud)

执行并查看文件aa.bin的Hex内容时,它看起来像这样:

0D 0A 0D 0A B4 FF 28

为什么值10以两个字节(0D 0A)写入,而char类型仅保存1个字节.(0D)是什么意思?

我正在使用G ++编译器(Windows上的MinGW)和cpp11.

cad*_*luk 9

在ASCII中,10是换行符的字符代码'\n'.

由于您以非二进制模式运行,因此换行符被解释为实际换行符,标准库将其转换为特定于平台的换行符序列,即在Windows系统上,CR-LF(回车符和换行符)或0D 0A十六进制.

尝试以二进制模式打开文件以跳过标准库的更高级别解释,并简单地操作字节而不是字符.使用"wb"用于这一目的的替代"w".


另外,使用tmp而不是&tmp.在某些情况下,数组被隐式转换为指针,包括手头的数据,它会衰减.&tmp是一个指向数组的实际指针,unsigned char (*)[5]在这种情况下.虽然两者在您的具体情况下是等效的,但这可能会产生问题.