保存部分结构

时间:2015-02-23 16:09:01

标签: c

我有这样的结构:

struct DATOS{
  short dato1;
  float dato2;
};

DATOS dat1;
dat1.dato1 = 123;

FILE *archivo;
archivo = fopen("archivo.bin","wb");
fwrite(&dat1,sizeof(DATOS),1,archivo);
fclose(archivo);

很好但是如果我想在另一个值之后输入,我该怎么做?

dat1.dato2 = 4.2536;

archivo = fopen("archivo.bin","ab");
fwrite(&dat1.dato2,sizeof(float),1,archivo); ????
fclose(archivo);

感谢。

2 个答案:

答案 0 :(得分:1)

是的,您的代码会附加floatdato2的二进制表示。

当然,没有必要关闭并重新打开文件,你可以按顺序执行fwrite(),然后关闭文件。

另外,这个:

fwrite(&dat1.dato2, sizeof(float), 1, archivo);

最好写成

fwrite(&dat1.dato2, sizeof dat1.dato2, 1, archivo);

无论dato2的类型如何,这都可以使用。

请注意,存储这样的二进制值会使文件非常不可移植,因为确切的内容在很大程度上取决于编写它的主机。

答案 1 :(得分:1)

如你的伪代码所写,第一个fwrite()会将整个结构的副本写入文件,dato2在那时就是垃圾。

您以后的fwrite()会将dato2的副本附加到该文件中。因此,在文件中它看起来像:

struct DATOS(带有dato2的垃圾)

如果您想稍后用实际数据覆盖垃圾dato2,那么您应该执行以下操作:

archivo = fopen("archivo.bin", "r+b");
fseek(archivo, (long) ((char*) &dat1.dato2 - (char*) &dat1), SEEK_SET);
fwrite(&dat1.dato2, sizeof(dat1.dato2), 1, archivo);
fclose(archivo);