Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 保存部分结构_C - Fatal编程技术网

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”会擦除整个文件,不是吗?是的,对不起,我现在就解决这个问题。非常感谢您的时间和您的回答朋友;-)