Лабораторная работа 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. Протестировать предложенную программу. Написать функции: