Например, если я написал «Доу» для отчества первого пациента в файле, и если я добавил в файл другого пациента без отчества, автоматически второе имя другого пациента будет «Доу».
просто замените
if((choice =='y') || (choice=='Y'))
{
printf("Insert new patient\'s middle name\n");
scanf("%s",input.midname);
}
от
if((choice =='y') || (choice=='Y'))
{
printf("Insert new patient\'s middle name\n");
scanf("%s",input.midname);
}
else
input.midname[0] = 0;
Есть ли способ очистить структуру, чтобы середина была равна нулю?
Существует только одно необязательное поле, но если вы действительно хотите это сделать, просто заполните все от 0 до memset(&input, 0, sizeof(input));
, например.
Обратите внимание, что сохранение данных с помощью fwrite(&input,sizeof(input),1,infile);
не позволит правильно прочитать файл в случае, если размер полей или порядок байтов не совпадают, или если позже вы добавите / удалите / измените поля (полей), поэтому это не портативный Сохраняйте поля одно за другим, используя их внешнее представление, чтобы быть переносимыми, начиная с номера формата, чтобы знать, как читать файл, если вы измените определения позже.
Я также рекомендую вам проверить значение, возвращаемое scanf , чтобы узнать, прочитали ли вы правильное значение.
В настоящее время, если пользователь вводит слишком длинную строку, вы будете выводить ее из поля с неопределенным поведением, ограничьте размер входных данных для строк.
(редактировать после вашего замечания)
Есть ли у вас ссылки на рекомендации, которые вы сказали для scanf
Если я хорошо понимаю, что у вас есть, например, char name[50]
, даже маловероятно, если пользователь введет слово, содержащее не менее 50 символов scanf("%s", input.name)
пишет, по крайней мере, 51 символ, выходящий из поля. Например, выполните scanf("%49s", input.name)
, чтобы не рисковать неопределенным поведением (49 вместо 50, чтобы иметь место для нулевого символа, заканчивающего строку)
Обратите внимание, что вы не можете ввести сложное имя, содержащее пробелы, используя scanf .
и для сохранения полей по одному
используете ли вы для записи , но fprintf , конечно, делая это, вы не можете прочитать уже существующие значения по fread , и вам нужно использовать, например, fscanf
Также вы (попробуйте) повторить
while (fread (& input, sizeof (input), 1, checkid))
{
check = input.ID;
}
также каждый раз, когда вы добавляете новый элемент, вам это не нужно, кроме как перед тем, как войти в цикл для добавления новых записей