考虑以下简单程序:
#include <stdio.h>
int main () {
FILE *fp;
printf("sizeof(int)=%d\n", sizeof(int));
fp = fopen("test.bin", "wb");
fprintf(fp, "%d", 14);
fclose(fp);
return 0;
}
它将以下输出提供给stdout
:
sizeof(int)=4
在任何文本编辑器中查看时,test.bin具有以下内容:
14
使用十六进制转储选项(vi
)查看xxd
时:
0000000: 3134 0a 14.
使用hexdump -c
查看时:
0000000 1 4 \n
0000003
显然我机器上的整数是四个字节,但hexdump
和vi
都告诉我只需要两个字节来表示14,另一个字节用于表示换行符。 test.bin的大小只有三个字节,这证实了这一点。但是,一个整数是四个字节,那么为什么只有两个字节代表它?
我完全忘记了什么明显的事实,似乎无法记住?
答案 0 :(得分:8)
您已将文字写入文件。这就是fprintf
的作用。它根据您的格式字符串将您的参数转换为文本,然后将该文本放入文件中。您实际上已经为文件写了三个字节:两个ASCII数字('1'和'4')和一个换行符('\ n')。请注意,0x31是'1'
的ASCII码,0x34是'4'
的ASCII码,0x0a是换行的ASCII码。
你需要写二进制文件。请使用fwrite
。
int i = 14;
fwrite(&i, sizeof(i), 1, fp);
答案 1 :(得分:4)
fprintf(fp, "%d", 14);
您正在将14
写为字符串,这就是为什么您会看到十六进制形式的文本31 34
,它是字符'1'
和'4'
的ASCII。
答案 2 :(得分:1)
我假设你想以二进制形式将数字写入文件。 换行:
fprintf(fp, "%d", 14);
要:
int i = 14;
fwrite(&i, sizeof(int), 1, fp);
请务必阅读man page以了解fwrite。请注意,如果您有x86或AMD64 CPU,您的字节将以小端顺序写入。如果您想确保始终以正确的字节顺序读取文件,则必须首先使用标题htonl
中的<arpa/inet.h>
函数转换该数字。当您使用fread
再次阅读该号码时,您必须使用ntohl
将其转换回来。