C 保存部分结构
我有一个这样的结构:C 保存部分结构,c,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 arc
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);
谢谢。是的,您的代码将附加
浮点值dato2
的二进制表示形式
不需要关闭和重新打开文件,当然,您可以按顺序执行这两项操作,然后关闭文件
此外,这:
fwrite(&dat1.dato2, sizeof(float), 1, archivo);
最好写为
fwrite(&dat1.dato2, sizeof dat1.dato2, 1, archivo);
这使得它无论是dato2
的类型都能工作
请注意,像这样存储二进制值会使文件非常不可移植,因为确切的内容在很大程度上取决于编写它的主机。正如在伪代码中所写的那样,第一个fwrite()会将整个结构的副本写入文件,此时dato2是垃圾
稍后的fwrite()将在文件中附加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);
结构DATO(带有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);
datosdat1代码>是错误的,因为它是当前编写的。在变量定义中使用<代码> Type Fux/<代码>,或者在变量定义中使用“代码>结构> /CODE > @ @ SurvavHOSH,但另一种选择是:不要使用C++编译器来编译C;它将允许这样的事情“工作”,即使它们不是有效的C。您想在文件中附加额外的结构,还是只覆盖文件中已经存在的一个结构的一部分?如果你想追加,你需要写一个全新的结构;否则,您无法真正知道文件中有一个short
和一个float
(加上可选的填充),后跟一个float
,因此没有好的方法再次读取数据。对于覆盖和追加,处理整个结构要容易得多。是的,我只想覆盖一个结构的一部分。是的,我认为最好是覆盖整个结构。非常感谢你,朋友。我想发问者可能想覆盖文件中结构的更新部分。他需要使用fseek()
和经常被忽略的offsetof()
宏(#include
)来完成我认为他正在做的事情。很好,但是想象一下这两个片段在程序的不同部分。因此,应该在不同的时间打开。嗯,但是使用修饰符“wb”会擦除整个文件,不是吗?是的,对不起,我现在就解决这个问题。非常感谢您的时间和您的回答朋友;-)