sizeof(int)是4个字节,但只写了两个

hal*_*exh 4 c integer sizeof

考虑以下简单程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

它将以下输出提供给stdout:

sizeof(int)=4
Run Code Online (Sandbox Code Playgroud)

在任何文本编辑器中查看时,test.bin具有以下内容:

14
Run Code Online (Sandbox Code Playgroud)

当观看vi使用十六进制转储选项(xxd):

0000000: 3134 0a                                   14.
Run Code Online (Sandbox Code Playgroud)

查看时hexdump -c:

0000000   1   4  \n
0000003
Run Code Online (Sandbox Code Playgroud)

显然,我的机器上的整数四个字节,但两者hexdumpvi告诉我,只要求两个字节来表示14,并用另一个字节来表示换行符.test.bin的大小只有三个字节,这证实了这一点.但是,一个整数是四个字节,那么为什么只有两个字节代表呢?

我完全忘记了什么明显的事实,似乎无法记住?

Dav*_*nan 8

您已将文本写入文件.这是做什么的fprintf.它根据您的格式字符串将您的参数转换为文本,然后将该文本放入文件中.实际上你已经为文件写了三个字节:两个ASCII数字('1'和'4')和一个换行符('\n').请注意,0x31是ASCII代码'1',0x34是ASCII代码'4',0x0a是换行符的ASCII代码.

你需要写二进制文件.使用fwrite了点.

int i = 14;
fwrite(&i, sizeof(i), 1, fp);
Run Code Online (Sandbox Code Playgroud)