Не удалось остановить ввод дубликатов идентификаторов при обработке файлов с помощью c

#c #file-handling

Вопрос:

Я создаю базу данных студентов с использованием языка c, в которой хранятся идентификатор, имя и филиал . Идентификатор должен оставаться уникальным для каждого учащегося и вводиться пользователем. Я попытался изменить идентификатор на int, но это также не имело никакого значения.

 struct student
{
    char id[20];
    char name[20];
    char branch[20];
};

void insert_student()
{
    FILE *fp1;
    struct student rcd;
    fp1 = fopen("students.dat", "a ");
    if (fp1 == NULL)
    {
        printf("Students data does not existsn");
        return;
    }
    char id[20];
    char name[20];
    char branch[20];
    printf("nEnter Student ID: ");
    scanf("%s",id);
    getchar();
    while (fread(amp;rcd,sizeof(struct student),1,fp1))
    {
        if(strcmp(rcd.id,id)==0)
        {
            printf("nStudent with ID %s already exists !n",id);
            fclose(fp1);
            return;
        }
    }
    printf("nEnter Student Name: ");
    scanf("%s",name);
    printf("nEnter Student Branch :");
    scanf("%s",branch);
    strncpy(rcd.id,id,20);
    strncpy(rcd.name,name,20);
    strncpy(rcd.branch,branch,20);
    fprintf(fp1, "Name =%sn", rcd.name);
    fprintf(fp1, "ID: %sn", rcd.id);
    fprintf(fp1, "Branch: %sn", rcd.branch);
    fprintf(fp1, "-------------nn");
    fclose(fp1);
    return;
}
 

Заранее спасибо

Комментарии:

1. Сколько сравнений делает цикл? Где находится указатель файла, когда вы открываете файл в "a " режиме? Вероятно, он находится в EOF, поэтому цикл ничего не читает. Вы должны использовать rewind(fp1); , чтобы переместить файл в начало для чтения перед циклом. Вы также не записываете данные в файл в том формате, в котором собираетесь их прочитать. Вы должны использовать fwrite(amp;rcd, sizeof(rcd), 1, fp1); для записи данных в файл.

2. Я попробовал команду перемотки назад, но она не внесла никаких изменений. Кстати, это должно быть fread, потому что мы должны только прочитать его, чтобы не вносить никаких изменений

3. Примечание: вы копируете код с отдельной скалярной функцией id name , branch которая в точности имитирует вашу struct . Вы можете сделать (например) struct student ask; , а затем scanf("%s",amp;ask.name); и т. Д. Затем, позже, вы можете просто сделать: rcd = ask; вместо нескольких strncpy звонков.