C 中的文件处理 - 意外输出

File handling in C - unexpected output

我正在尝试找出以下代码的输出:

#include <stdio.h>

int main()
{
    FILE *f;
    int i = 20;
    if ((f = fopen("file.DAT", "wb")) != NULL) {
        fwrite(&i, 4, 1, f);
        fclose(f);
    }
    return 0;
}

32-bit 系统上,paragraph sign(十进制 ascii182)被写入二进制文件。

问题: 如何确定将哪个ascii值写入二进制文件?

函数fwrite的第一个参数是指向数组的指针,但代码中没有定义数组。如何跟踪哪些字节被写入二进制文件?

此代码将 int i 的内部表示写入以二进制模式打开的文件 file.DAT 中。 &i不是数组的地址,是局部变量i的地址。 fwrite 将在该地址写入 4 个字节,这在 32 位系统上构成了所讨论的整数。

在 Intel PC 和 Mac 等小端架构上,文件应包含 4 个字节,其值为:

+---------------------------+
| 0x14 | 0x00 | 0x00 | 0x00 |
+---------------------------+

但是在大端机器上,例如老式 Mac,文件内容将是:

+---------------------------+
| 0x00 | 0x00 | 0x00 | 0x14 |
+---------------------------+

如果将此文件打印到终端或将其加载到编辑器中,您可能会看到一个有趣的非 ASCII 值字符 0x14 和其他标记或 none 空字节.这个字符显示为段落符号,可能是因为编辑器进行了某种字符集转换。使用二进制转储实用程序查看文件的确切内容。

为了更好的可移植性,代码应为 fwrite(&i, sizeof i, 1, f);