Ошибка в программе со структурами - C (СИ)
Формулировка задачи:
#include<stdio.h>
#include<conio.h>
#include<locale.h>
#include <string.h>
#include <stdlib.h>
struct hospital
{
char fio[15];
char pol[3];
int year;
char city[20];
char diagnoz[100];
};
void show (char *);
void add (char *);
int main(void)
{
setlocale(LC_ALL,"Russian");
char file[50];
char menu;
puts("Введите имя файла:");
gets(file);
do
{
puts("1.Просмотр файла");
puts("2.Добавление записи");
puts("3.Редактирование файла");
puts("4.Поиск");
puts("5.Выход");
puts("Выберите действие:");
menu=getch();
switch(menu)
{
case '1':show(file); break;
case '2':add(file); break;
}
}while(menu!='5');
return 0;
}
struct hospital input_sp(void)
{
struct hospital sp;
int tmp;
fflush(stdin);
puts("Фамилия:");
gets(sp.fio);
puts("Пол:");
gets(sp.pol);
puts("Возраст:");
scanf("%d",&tmp);
sp.year=tmp;
puts("Город:");
gets(sp.city);
puts("Диагноз:");
gets(sp.diagnoz);
return sp;
}
void show(char *file)
{
FILE *f;
struct hospital sp;
int nom=0;
system ("CLS");
if(f=fopen(file, "rb")==NULL)
{
puts("Ошибка при открытии файла");
}
puts ("| N | Фамилия | Пол | Возраст | Город | Диагноз |");
puts ("-------------------------------------------------------------");
while(fread(&sp,sizeof(sp),1,f)==1)
printf ("|%3d |%30s |%11s |%5d |%11s |\n", ++nom,sp.fio,sp.pol,sp.year,sp.city,sp.diagnoz);
puts ("-------------------------------------------------------------");
getch();
}
void add(char *file)
{
FILE *f;
struct hospital sp;
system ("CLS");
if(f=fopen(file, "ab")==NULL)
{
puts("Ошибка при открытии файла");
return ;
}
sp=input_sp();
fwrite(&sp,sizeof(sp),1,f);
fclose (f);
}Решение задачи: «Ошибка в программе со структурами»
textual
Листинг программы
#include<stdio.h>
#include<conio.h>
#include<locale.h>
#include <string.h>
#include <stdlib.h>
struct hospital
{
char fio[15];
char pol[3];
int year;
char city[20];
char diagnoz[100];
};
void show (char *);
void add (char *);
int main(void)
{
char file[50];
char menu;
setlocale(LC_ALL,"Russian");
puts("Введите имя файла:");
gets(file);
do
{
puts("1.Просмотр файла");
puts("2.Добавление записи");
puts("3.Редактирование файла");
puts("4.Поиск");
puts("5.Выход");
puts("Выберите действие:");
menu=getch();
switch(menu)
{
case '1':show(file); break;
case '2':add(file); break;
}
}while(menu!='5');
return 0;
}
struct hospital input_sp(void)
{
struct hospital sp;
int tmp;
fflush(stdin);
puts("Фамилия:");
gets(sp.fio);
puts("Пол:");
gets(sp.pol);
puts("Возраст:");
scanf("%d",&tmp);
sp.year=tmp;
puts("Город:");
gets(sp.city);
puts("Диагноз:");
gets(sp.diagnoz);
return sp;
}
void show(char *file)
{
FILE *f;
struct hospital sp;
int nom=0;
system ("CLS");
if(f=fopen(file, "rb")==NULL)
{
puts("Ошибка при открытии файла");
}
puts ("| N | Фамилия | Пол | Возраст | Город | Диагноз |");
puts ("-------------------------------------------------------------");
while(fread(&sp,sizeof(sp),1,f)==1)
printf ("|%3d |%30s |%11s |%5d |%11s |\n", ++nom,sp.fio,sp.pol,sp.year,sp.city,sp.diagnoz);
puts ("-------------------------------------------------------------");
getch();
}
void add(char *file)
{
FILE *f;
struct hospital sp;
system ("CLS");
if(f=fopen(file, "ab")==NULL)
{
puts("Ошибка при открытии файла");
return ;
}
sp=input_sp();
fwrite(&sp,sizeof(sp),1,f);
fclose (f);
}
Объяснение кода листинга программы
- Структура
hospitalсодержит поляfio(ФИО),pol(пол),year(год рождения),city(город) иdiagnoz(диагноз). - В функции
mainпользователь вводит имя файла, затем выбирает действие из меню: просмотр файла (1), добавление записи (2), редактирование файла (3), поиск (4) или выход (5). - В функции
input_spпроисходит ввод данных о пациенте: фамилия, пол, возраст, город и диагноз. Возраст вводится с помощьюscanf, чтобы избежать переполнения буфера. - Функция
showоткрывает файл с помощьюfopenи считывает данные о пациентах построчно с помощьюfread. Затем выводит данные в формате таблицы с помощьюprintf. - Функция
addоткрывает файл с помощьюfopenи добавляет данные о новом пациенте в конец файла с помощьюfwrite. Затем закрывает файл с помощьюfclose. - В функции
mainпосле выполнения действия, выбранного пользователем, программа возвращается в начало цикла и предлагает пользователю выбрать новое действие. - Если пользователь выбирает выход (5), программа завершается.