我有这样的结构:
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);
感谢。
答案 0 :(得分:1)
是的,您的代码会附加float
值dato2
的二进制表示。
当然,没有必要关闭并重新打开文件,你可以按顺序执行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);