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

时间:2013-12-05 12:15:26

标签: 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;
}

它将以下输出提供给stdout

sizeof(int)=4
在任何文本编辑器中查看时,

test.bin具有以下内容:

14

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

0000000: 3134 0a                                   14.

使用hexdump -c查看时:

0000000   1   4  \n
0000003

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

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

3 个答案:

答案 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将其转换回来。