Ошибка в программе со структурами - 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);
}

Объяснение кода листинга программы

  1. Структура hospital содержит поля fio (ФИО), pol (пол), year (год рождения), city (город) и diagnoz (диагноз).
  2. В функции main пользователь вводит имя файла, затем выбирает действие из меню: просмотр файла (1), добавление записи (2), редактирование файла (3), поиск (4) или выход (5).
  3. В функции input_sp происходит ввод данных о пациенте: фамилия, пол, возраст, город и диагноз. Возраст вводится с помощью scanf, чтобы избежать переполнения буфера.
  4. Функция show открывает файл с помощью fopen и считывает данные о пациентах построчно с помощью fread. Затем выводит данные в формате таблицы с помощью printf.
  5. Функция add открывает файл с помощью fopen и добавляет данные о новом пациенте в конец файла с помощью fwrite. Затем закрывает файл с помощью fclose.
  6. В функции main после выполнения действия, выбранного пользователем, программа возвращается в начало цикла и предлагает пользователю выбрать новое действие.
  7. Если пользователь выбирает выход (5), программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы