【发布时间】:2023-01-08 20:40:30
【问题描述】:
我正在尝试做几个练习来了解在 C 上写入文本文件和二进制文件之间的区别,并且在使用 hexdump 实用程序查看结果时,我发现了意想不到的结果。你能帮我理解原因吗?
特别是,我正在尝试使用以下代码编写文本文件:
#include <stdio.h>
int main() {
FILE *ptr_myfile;
char c = 'a';
int numero = 12345;
ptr_myfile = fopen("test.txt","w");
if (!ptr_myfile){
printf("Unable to open file!");
return 1;
}
fwrite(&c, sizeof(char), 1, ptr_myfile);
fwrite(&numero, sizeof(int), 1, ptr_myfile);
fclose(ptr_myfile);
return 0;
}
在执行“cat test.txt”时,我发现文件的内容是:
猫测试.txt
a90
无法理解 12345 是如何转换为 90 的。
此外,如果我做一个
hexdump test.txt 0000000 3961 0030 0000 0000005在那种情况下,我发现第一个字节的值是 39。为什么?第二个值 (61) 已经与 'a'' 的 ascii 值匹配(61 hex = 97 dec = 'a' ascii code),但找不到其余位的逻辑解释。
如果我将写入模式更改为二进制文件,修改行
ptr_myfile=fopen("test.txt","w") by ptr_myfile=fopen("test.txt","wb")我没有看到文件书面内容的行为有任何变化。
【问题讨论】:
-
使用
fwrite,您可以写入值的原始二进制数据,而不是它们的文本表示形式。对于int,通常是四个字节的数据。 -
提示,十六进制的 12345 是 3039。
-
使用
hexdump -C,应该不会那么混乱 -
@Someprogrammerdude,所以,对于 fwrite,我总是写二进制文件,无论我以哪种模式打开文件?您是说我将文件视为文本的二进制文件吗?为什么忽略“fopen”模式?
-
对,那是正确的。十进制值
12345将被写为四个字节0x00003039。如果你想写文字,使用例如fprintf喜欢fprintf(ptr_myfile, "%c%d", c, numero)
标签: c