通过fwrite将int值写入二进制文件

时间:2013-06-26 10:26:10

标签: c linux binaryfiles fwrite

我有以下示例C代码将intchar array写入Linux OS上的文件。

int main(void){
    struct eg{
        int x;
        char y[3];
    };

    struct eg example_array[5] = {{ 0, {0}}};

    int i;
    for(i=0;i<3;i++){
        example_array[i].x = i;
        strcpy(example_array[i].y,"12");
    }

    FILE *fp;
    fp = fopen("/home/ubuntu/example", "wb");
    fwrite(&example_array, sizeof(struct eg), 5, fp);
    fclose(fp);

return 0;
}

nano example将内容显示为^@^@^@^@12^@^@^A^@^@^@12^@^@^B^@^@^@12^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

hexedit example将其显示为

00000000   00 00 00 00  31 32 00 00  01 00 00 00  31 32 00 00  02 00 00 00  31 32 00 00  00 00 00 00  ....12......12......12......
0000001C   00 00 00 00  00 00 00 00  00 00 00 00                                                      ............

我在二进制文件中看不到example_array[i].x值。谁能告诉我如何在上面的代码中使用fwrite

^@^@^@^@^@......代表什么?他们是空白吗?

2 个答案:

答案 0 :(得分:2)

^X使用不可打印的ASCII值对字节进行编码。 ^@表示0^A表示1^B表示2,依此类推。

   int   ch[] padding
-------- ---- -------
^@^@^@^@ 12^@   ^@
^A^@^@^@ 12^@   ^@
^B^@^@^@ 12^@   ^@
^@^@^@^@ ^@^@   ^@
^@^@^@^@ ^@^@   ^@
^@^@

您的计算机以最低有效字节开头存储数据。前四列代表您的int;接下来的三个是char[3]。最后,在struct s之间有一个1字节的填充。

答案 1 :(得分:1)

每个^@表示一个二进制0x00,例如^A表示0x01,^B表示0x02,依此类推。看看你发布的Hex转储。由于sizeof(int)在您的平台上为4,因此对于每个example_array[i].x,您将找到四个字节,然后是另外三个包含字符串y的字节。您会看到,您的第一个x写为00 00 00 00,第二个x01 00 00 00,这正是整数存储在您系统中的方式。如果要将值写为字符串,例如要有一个独立于平台的输出文件,你可以使用像

这样的东西
fprintf( fp, "%d %s ", example_array[i].x, example_array[i].y )
相关问题