Лабораторная работа 7. файлы и структуры
Рассмотрим пример. Создадим файл, в котором храниться информация о рабочих некоторого предприятия: ФИО, год рождения, оклад. Организуем возможность просмотра, редактирования и добавления записей в файл.
Текст программы:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
const int L=30;
typedef struct {char name[30]; int gr;float oklad;} MAN; //описание структурного типа MAN
FILE *aa, *temp; //объявление основного файла аа и временного файла temp
void main() //главная функция
{int a;
void VIEW(), APP(), NEWFILE(), EDITF(); //объявление функций
clrscr(); //очистка экрана
do //вывод на экран главного меню программы
{ printf(" \n MAIN MENU ");
printf("\n 0. NEW FILE");
printf("\n 1. VIEW FILE");
printf("\n 2. APPEND FILE“);
printf("\n 3. EDIT FILE");
printf("\n 4. EXIT");
printf("\n\n\n Input punkt of main menu: ");
scanf("%d", &a); //выбор пункта главного меню
switch (a)
{case 0: { NEWFILE(); break;} //
case 1: { VIEW(); break;}
case 2: { APP(); break;}
case 3: { EDITF(); break;}
case 4: { printf(" Good Bye ! "); break;}
default : printf("ERROR ! ! !"); break;
}
} while(a!=4);
}
void LINE() //функция вывода сплошной линии
{ for (i=1;i<35;i++) printf("_"); printf("\n"); }
void VIEW() //функция, реализующая просмотр файла OKLAD.txt
{ int count=0,i;
MAN buf; //буферная переменная типа MAN
aa=fopen("OKLAD.txt","r"); //открытие файла OKLAD.txt для просмотра
LINE(); printf("\nN | FIO | God | OkJIag(py6)\n\n"); LINE(); //вывод шапки таблицы
while(!feof(aa)) //пока не достигнут конец файла
{
fscanf(aa,"%s%d%f", &buf.name, &buf.gr, &buf.oklad); //чтение из файла в буфер
count++;
printf("\n%d.| %-10s| %5d |%10.2f\n", count, buf.name, buf.gr, buf.oklad); //вывод на экран
}
LINE();
fclose(aa); //закрытие файла OKLAD.txt
}
void APP() //функция, реализующая добавление записей в файл OKLAD.txt
{int n,i;
MAN buf;
aa=fopen("OKLAD.txt","a"); //открытие файла OKLAD.txt для добавления записей
printf("CKOJIbKO 3anuceu' BBoguTb? "); scanf("%d", &n);
for(i=1;i<=n;i++)
{printf("BBeguTe qpaMuJIuI0 :"); scanf("%s", &buf.name);
printf("BBeguTe rog po}I{geHu9 :"); scanf("%d", &buf.gr);
printf("BBeguTe CyMMy OKJIaga :"); scanf("%f", &buf.oklad);
fprintf(aa, "\n%s %d %f", buf.name, buf.gr, buf.oklad); //запись в файл
}
fclose(aa); //закрытие файла OKLAD.txt
}
void NEWFILE() //функция, реализующая создание файла OKLAD.txt
{int n,i;
MAN buf;
aa=fopen("OKLAD.txt","w"); //открытие файла OKLAD.txt для записи
printf("CKOJIbKO 3anuceu' BBoguTb? "); scanf("%d", &n);
for(i=1;i<=n;i++)
{printf("BBeguTe qpaMuJIuI0 :"); scanf("%s", &buf.name);
printf("BBeguTe rog po}I{geHu9 :"); scanf("%d", &buf.gr);
printf("BBeguTe CyMMy OKJIaga :"); scanf("%f", &buf.oklad);
fprintf(aa, "\n%s %d %f", buf.name,buf.gr,buf.oklad); //запись в файл
}
fclose(aa); //закрытие файла OKLAD.txt
}
void EDITF() //функция, реализующая редактирование файла OKLAD.txt
{aa=fopen("OKLAD.txt", "r"); //открытие файла OKLAD.txt для просмотра
temp=fopen("temp.txt", "w"); //открытие файла temp.txt для записи
int K,i;
MAN buf;
char str[30];
printf("BBeguTe HoMep pegakTupyeMou' 3anucu:"); scanf("%d", &K);
for(i=1;i<K;i++) //копирование первых (К-1) записей из файла OKLAD.txt в файл temp.txt
{fscanf(aa,"%s%d%f", &buf.name,&buf.gr, &buf.oklad); //чтение из файла OKLAD.txt
fprintf(temp, "\n%s %d %f", buf.name,buf.gr,buf.oklad); //запись в файл temp.txt
}
//чтение К-ой записи из файла OKLAD.txt и вывод на экран
fscanf(aa,"%s%d%f", &buf.name,&buf.gr, &buf.oklad);
printf("\n\n%30s %5d %10.2f\n", buf.name,buf.gr,buf.oklad);
fflush(stdin); //очистка буфера
printf("BBeguTe qpaMuJIuI0 :"); gets(str);
if(strlen(str) > 1) strcpy(buf.name, str); //если не пусто, то записать в буфер
printf("BBeguTe rog po}I{geHu9 :"); gets(str);
if(strlen(str) > 1) buf.gr=atoi(str); //если не пусто, то записать в буфер
printf("BBeguTe CyMMy OKJIaga :"); gets(str);
if(strlen(str) > 1) buf.oklad=atof(str); //если не пусто, то записать в буфер
fprintf(temp, "\n%s %d %f", buf.name,buf.gr,buf.oklad);
//копирование оставшихся записей из файла OKLAD.txt в файл temp.txt
while(!feof(aa))
{fscanf(aa,"%s%d%f", &buf.name,&buf.gr, &buf.oklad);
fprintf(temp, "\n%s %d %f", buf.name,buf.gr,buf.oklad);
}
fclose(aa); fclose(temp); //закрытие файлов
aa=fopen("OKLAD.txt", "w"); //открытие файла OKLAD.txt для записи
temp=fopen("temp.txt", "r"); //открытие файла temp.txt для просмотра
//копирование записей из файла temp.txt в файл OKLAD.txt
while(!feof(temp))
{fscanf(temp,"%s%d%f", &buf.name,&buf.gr, &buf.oklad);
fprintf(aa, "\n%30s%5d%10.2f", buf.name,buf.gr,buf.oklad);
}
fclose(temp); fclose(aa); //закрытие файлов
}
Задание 1. Протестировать предложенную программу. Написать функции: