gpt4 book ai didi

c - 为什么用C修改二进制文件的double是错误的?

转载 作者:太空宇宙 更新时间:2023-11-04 05:08:37 25 4
gpt4 key购买 nike

我写了一个函数,读取二进制文件中结构体中的 double 值,并计算该值,然后将计算出的 double 值写入二进制文件。

结构是:

struct logData{
long logId;
char logDate[11];
char logNote[20];
double charge;
double total;
};

读取和修改数据charge的函数是:

long size = sizeof(struct logData);

void update(FILE* fp, int n){
fseek(fp,(n-1)*size, SEEK_SET);
struct logData thisLogData;
fread(&thisLogData,size,1,fp);

long offset = sizeof(thisLogData.logId)+sizeof(thisLogData.logNote)+ sizeof(thisLogData.logDate);
double oldCharge = thisLogData.charge;
scanf("%lf", &thisLogData.charge);
fseek(fp, -size+offset, SEEK_CUR);
fwrite(&thisLogData.charge, sizeof(thisLogData.charge), 1, fp);
fclose(fp);
}

许多 struct:logData 都存储在二进制文件中。参数:n代表logData的位置。

我成功读取了charge的前一个值(oldCharge in function update())。 charge的初始值为20,我在update函数中输入40。写入成功后,读取charge的值,发现既不是20也不是40,而是一个奇怪的32.55(我保留了两位小数)。

我试过修改logDatelogNote都可以修改成功(当然offset是不一样的)。只有 double 值 chargetotal 会有奇怪的结果。

这是什么原因?

最佳答案

long offset = sizeof(thisLogData.logId)+sizeof(thisLogData.logNote)+ sizeof(thisLogData.logDate);

这不是成员的偏移量。结构成员有填充。使用 offsetof

size_t offset = offsetof(struct logData, charge);

关于c - 为什么用C修改二进制文件的double是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55378963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com