我有以下示例C代码将int
和char 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
?
^@^@^@^@^@
和......
代表什么?他们是空白吗?
答案 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
,第二个x
为01 00 00 00
,这正是整数存储在您系统中的方式。如果要将值写为字符串,例如要有一个独立于平台的输出文件,你可以使用像
fprintf( fp, "%d %s ", example_array[i].x, example_array[i].y )