Изменение произвольной структуры в двоичном файле

seviller

Доброго времени суток. Испытываю затруднения с записью структуры в двоичный файл в определенное место. Суть такова. Вначале в файл nameage.dat записывается 10 экземпляров структуры client, переменные которой инициализированы строкой "empty". Затем программа три раза просит ввести имя и фамилию, записывая их при этом в первый попавшийся пустой слот("empty"). После завершения цикла оказывается, что она ничего не записала в файл. В чем может мой косяк, скажите, пожалуйста?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct person {
char lastname[20];
char firstname[20];} client = {"empty", "empty"};
 
int record(struct person *);
 
main(){
    int i;
    FILE *fp;
 
    fp = fopen("C:\\test\\nameage.dat", "wb");
 
    for(i = 1; i <= 10; i++)
        fwrite(&client, sizeof(struct person), 1, fp);
    fclose(fp);
 
    for(i = 1; i <= 3; i++){
        printf("Enter first name:\n");
        fgets(client.firstname, 20, stdin);
        printf("Enter last name:\n");
        fgets(client.lastname, 20, stdin);
        record(&client);
        }
 
    return 0;
}
 
 
int record(struct person *client){
    FILE *search;
    struct person st;
    
    search = fopen("C:\\test\\nameage.dat", "r+b");
    
    while(!feof(search)){
        fread(&st, sizeof(struct person), 1, search);
        if(strstr(st.firstname, "empty")){
            fwrite(client, sizeof(struct person), 1, search);
            fclose(search);
            return 0;
            }
    }
}
1 ответ

seviller

seviller, функция record(). Т.к. вы прочитали в строке 40 структуру то offset файла сместился на следующую запись и когда вы пытаетесь писать в строке 42 то пишите по адресу следующей структуры. Нужно перед записью вернуться на sizeof(struct person) байт назад.