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
(十进制 ascii
值 182
)被写入二进制文件。
问题: 如何确定将哪个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);
我正在尝试找出以下代码的输出:
#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
(十进制 ascii
值 182
)被写入二进制文件。
问题: 如何确定将哪个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);