1

我有以下示例 C 代码可在 Linux 操作系统上写入int和写入char array文件。

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上面的代码?

做什么^@^@^@^@^@......代表什么?它们是空格吗?

4

2 回答 2

2

^X使用不可打印的 ASCII 值对字节进行编码。^@手段0^A手段1^B手段2,等等。

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

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

于 2013-06-26T10:33:54.920 回答
1

每一个^@代表一个二进制0x00,比如^A代表0x01,^B代表0x02等等。看看你发布的十六进制转储。由于 sizeof( int ) 在您的平台上为 4,因此example_array[i].x您会发现每个字节有 4 个字节,然后是包含 string 的另外三个字节y。你会看到,你的第一个x写成00 00 00 00,你的第二个写成,这x正是01 00 00 00整数在系统上的存储方式。如果您想将值写为字符串,例如拥有一个独立于平台的输出文件,您可以使用类似的东西

fprintf( fp, "%d %s ", example_array[i].x, example_array[i].y )
于 2013-06-26T10:43:03.413 回答