Вы прочитали полные logData , вы можете изменить элемент read, а затем записать все его, возможно, у вас проблема с заполнением, поэтому вычисленное смещение неверно
bool update(FILE* fp, int n){
struct logData thisLogData;
if ((fseek(fp,(n-1)*size, SEEK_SET) == -1) ||
(fread(&thisLogData,size,1,fp) == 1)) {
??? indicate error ???
fclose(fp);
return false;
}
if (scanf("%lf", &thisLogData.charge) != 1) {
??? indicate error ???
fclose(fp);
return false;
}
fseek(fp,(n-1)*size, SEEK_SET);
return ((fwrite(&thisLogData,size,1,fp) != -1)
& (fclose(fp) != -1); /* not && because have to close in all cases */
}
, иначе используйте offsetof только для записи нового значения заряда без чтения элемента:
bool update(FILE* fp, int n){
double d;
if (scanf("%lf", &d) != 1) {
??? indicate error ???
fclose(fp);
return false;
}
if (fseek(fp,(n-1)*size + offsetof(struct logData, charge), SEEK_SET) == -1) {
??? indicate wrong n / file ???
fclose(fp);
return false;
}
return ((fwrite(&d,sizeof(double),1,fp) != -1)
& (fclose(fp) != -1)); /* not && because have to close in all cases */
}
Примечание: странно, что функция закрывает файл, но делаетне открывайте его, более логично не делать здесь закрытие