#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
звонков.