Структуры и работа с файлами в Си - C (СИ)
Формулировка задачи:
Здравствуйте !
Помогите с работой на создание структур и ввод и вывод с файла
Ввести структуру СТУДЕНТ с полями ФИО, ЧИСЛО, МЕСЯЦ, ГОД РОЖДЕНИЯ.
Написать и протестировать функции
a. добавления нового студента;
b. вывода на экран списка студентов;
c. поиска студентов по году рождения
на данный момент имеется код
С добавлением нового студента кое как справился. Не получается задание с выводом на экран списка студентов и поиск студентов по году рождения
данные, которые уже содержатся в текстовом документе
Алексеева Анна Анатольевна 2 7 1998
Алиев Магомед Асламбекович 3 8 1998
Антонов Сергей Владимирович 4 8 1998
Ануфриева Диана Романовна 5 1 1998
Вислогузова Юлия Николаевна 6 1 1998
Власова Ольга Сергеевна 7 3 1998
Волков Александр Викторович 8 4 1998
Гайдаров Юрий Исламович 9 5 1998
Прошу помочь!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX 200
struct
{
char FIO[30];
int ch;
int mes;
int god;
}NEW[MAX];
int find_free(void);
//инициализация массива структур
void init_list(void)
{
register int t;
for(t=0; t<MAX; ++t) NEW[t].FIO[0] = '\0';
}
//вызов меню пользователя
int menu_select(void)
{
char s[80];
int c;
printf("1 - Add new student\n2 - Student list\n3 - Search students\n");
do
{
printf("Hello!\nSelect a category: ");
gets(s);
c=atoi(s);
} while(c<0||c>4);
return c;
}
//Добавление нового студента
void newstudent(void)
{
FILE *f;
if ((f=fopen("C:\\stuct\\1.txt","a+"))==NULL){
printf("not open");return;
}
int slot;
char s[80];
slot = find_free();
if(slot==-1) {
printf("\nlist full");
return;
}
printf("Enter FIO: ");
gets(NEW[slot].FIO);
fprintf(f,"%s " ,NEW[slot].FIO);
printf("Enter day: ");
scanf("%d",&NEW[slot].ch);
fprintf(f, "%d ",NEW[slot].ch);
printf("Enter month: ");
scanf("%d",&NEW[slot].mes);
fprintf(f,"%d ",NEW[slot].mes);
printf("Enter year: ");
scanf("%d",&NEW[slot].god);
fprintf(f,"%d\n",NEW[slot].god);
fclose(f);
}
/* Поиск свободной структуры. */
int find_free(void)
{
register int t;
for(t=0; NEW[t].FIO[0] && t<MAX; ++t) ;
if(t==MAX) return -1; /* свободных структур нет */
return t;
}
//Список студентов
void list(void)
{
}
//Поиск студентов
void search(void)
{
}
//основная функция
int main(void)
{
char choice;
//FILE *f;
// if ((f=fopen("C:\Users\PandaZz\Desktop\data.txt","a+"))!=NULL)
init_list(); /* инициализация массива структур */
for(;;) {
choice = menu_select();
switch(choice) {
case 1: newstudent();
break;
case 2: list();
break;
case 3: search();
break;
case 4: exit(0);
}
}
return 0;
}Решение задачи: «Структуры и работа с файлами в Си»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include<locale.h>
#define MAX 200
struct student
{
char FIO[40];
int ch;
int mes;
int god;
}NEW[MAX];
int find_free(void);
//инициализация массива структур
void init_list(void)
{
register int t;
for(t=0; t<MAX; ++t) NEW[t].FIO[0] = '\0';
}
//вызов меню пользователя
int menu_select(void)
{
char s[80];
int c;
printf("1 - Add new student\n2 - Student list\n3 - Search students\n");
do
{
printf("Hello!\nSelect a category: ");
gets(s);
c=atoi(s);
} while(c<0||c>4);
return c;
}
//Добавление нового студента
void newstudent(void)
{
FILE *f;
if((f=fopen("C:\\stuct\\1.txt","a+"))==NULL){
printf("not open");return;
}
int slot;
char s[80];
slot = find_free();
if(slot==-1) {
printf("\nlist full");
return;
}
printf("Enter FIO: ");
gets(NEW[slot].FIO);
fputs(NEW[slot].FIO,f);
printf("Enter day: ");
scanf("%d",&NEW[slot].ch);
fprintf(f, "%d ",NEW[slot].ch);
printf("Enter month: ");
scanf("%d",&NEW[slot].mes);
fprintf(f,"%d ",NEW[slot].mes);
printf("Enter year: ");
scanf("%d",&NEW[slot].god);
fprintf(f,"%d\n",NEW[slot].god);
fclose(f);
}
/* Поиск свободной структуры. */
int find_free(void)
{
register int t;
for(t=0; NEW[t].FIO[0] && t<MAX; ++t) ;
if(t==MAX) return -1; /* свободных структур нет */
return t;
}
//Список студентов
void list(void)
{
FILE *f;
char c;
int i=0;
if((f=fopen("C:\\stuct\\1.txt","r+"))==NULL)
{
printf("not open\n");
return;
}
//system("pause");
while((c=getc(f))!=EOF)
{
ungetc(c,f);
fgets(NEW[i].FIO,sizeof(NEW[i].FIO),f);
fscanf(f,"%d",&NEW[i].ch);
fscanf(f,"%d",&NEW[i].mes);
fscanf(f,"%d",&NEW[i].god);
i++;
}
fclose(f);
//system("pause");
for (int j=0;j<i;j++)
{
printf("%s ",NEW[j].FIO);
system("pause");
printf("%d ",NEW[j].ch);
printf("%d ",NEW[j].mes);
printf("%d \n",NEW[j].god);
}
}
//Поиск студентов
void search(void)
{
}
//основная функция
int main(void)
{
setlocale(LC_ALL,"Russian");
char choice;
//FILE *f;
// if ((f=fopen("C:\Users\PandaZz\Desktop\data.txt","a+"))!=NULL)
init_list(); /* инициализация массива структур */
for(;;) {
choice = menu_select();
switch(choice) {
case 1: newstudent();
break;
case 2: list();
break;
case 3: search();
break;
case 4: exit(0);
}
}
return 0;
}
Объяснение кода листинга программы
- Объединение и связывание:
Код использует оператор
#includeдля объединения и связывания с библиотеками, необходимыми для работы с файлами и вводом-выводом в стандартном C. - Инициализация массива структур:
Функция
init_list()инициализирует массив структурNEW, устанавливая каждое полеFIOна начальный ноль. Это гарантирует, что при добавлении нового элемента в массив структурNEWполяFIOне будут содержать старые данные. - Ввод данных:
Функция
newstudent()добавляет новую запись в файл, считывая данные от пользователя и записывая их в файл. ПоляFIO,ch,mesиgodструктурыstudentзаполняются данными, введенными пользователем. - Поиск данных:
Функция
find_free()ищет первую свободную структуру в массиве структурNEW. Она перебирает все структуры в массиве, пока не найдет структуру, полеFIOкоторой не содержит данных. Если такой структуры нет, функция возвращает -1. - Чтение данных:
Функция
list()открывает файл и читает данные из него в массив структурNEW. Она считывает поляFIO,ch,mesиgodкаждой структуры из файла и выводит их на экран. - Поиск данных:
Функция
search()пока не реализована, но, судя по всему, она должна искать конкретного студента в массиве структурNEWна основе его имени или другой идентифицирующей информации. - Главное меню:
Функция
main()содержит главное меню программы, которое позволяет пользователю выбирать различные операции, такие как добавление нового студента, просмотр списка студентов и поиск студентов. - Закрытие программы:
Функция
exit(0)используется для корректного завершения программы и освобождения всех выделенных ресурсов.