我有一个这样的结构:

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);

谢谢。

最佳答案

正如在伪代码中所写的,第一个fwrite()将把整个结构的副本写入文件,此时dato2是垃圾。
稍后的fwrite()将向文件追加一个dato2副本。所以,在文件中它看起来像:
struct DATOS(带用于dato2的垃圾)
浮动
如果以后只想用实际数据覆盖垃圾数据2,那么应该执行以下操作:

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);

08-16 23:16