Главная / Оаип / Задание №6. Обработка структур с использованием файлов

Задание №6. Обработка структур с использованием файлов

Цель работы: изучить правила создания и обработки данных структурного типа с использованеием файлов. Написать и отладить программу по созданию файлов.

6.1. Теоретические сведения

Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием Шаблона:

struct Рerson {

char Fio[30];

double sball;

};

Объявление переменных созданного структурного типа:

Person Stud, *p_Stud;

Обращение к элементам структур производится посредством:

1) операции принадлежности ( . ) в виде:

ID_структуры . ID_поля или (*Указатель) . ID_поля

2) операции косвенной адресации (–>) в виде:

Указатель –> ID_поля или &(ID_структуры) . ID_поля

Для приведенного выше примера

1) Stud. Fio = “Иванов А. И.”; //Инициализация данных

Stud. sball = 5.75;

2) р_Stud –> Fio = “Иванов А. И.”;

р_Stud –> sball =5.75;

В языке C/С++ файл рассматривается как поток (Stream), представляющий собой последовательность считываемых или записываемых байт. При этом последовательность записи определяется самой программой.

Работа с файлами

Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое. Прототипы большинства функций по обработке файлов описаны в библиотеках Stdio.H и Io.H.

Прежде чем работать с файлом, его нужно открыть для доступа, т. е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т. д. В языке С/С++ это выполняет функция Fopen(), которая связывает физический файл на носителе с логическим именем в программе. Логическое имя – это указатель на файл, т. е. на область памяти, где хранится информация о файле. Указатели на файлы необходимо декларировать:

FILE *Указатель на файл;

Формат функции

Fopen( “Строка 1” , “Строка 2” );

В Строке 1 указывается место, в которое мы собираемся поместить файл, например: “d:\work\sved. txt” – файл с именем sved. txt, который будет находиться на диске D, в папке Work; если путь к файлу не указывать, то он будет размещен в рабочей папке проекта.

В Строке 2 указывается код открытия файла:

W – для записи, если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается;

R – для чтения; если файла нет, то возникает ошибка;

A – для добавления новой информации в конец;

R+, W+ – возможны чтение и запись информации;

A+ – то же, что и для A, только запись можно выполнять в любое место файла, доступно и чтение файла.

По умолчанию файл открывается в текстовом режиме (T), указав B – файл открывается в двоичном режиме.

Если при открытии файла произошла ошибка, функция Fopen возвращает значение NULL.

После работы доступ к файлу необходимо закрыть с помощью функции Fclose(Указатель файла), например, Fclose ( F );

Для закрытия нескольких файлов введена функция: void Fcloseall(void);

Приведем пример минимального набора операторов, необходимых для корректной работы с файлом:

#include <stdio. h>

. . .

FILE *f_my;

if( ! ( f_my = fopen(“rez. txt”, “r+t” ) ) ) {

puts(“ Ошибка открытия файла!”);

return;

}

. . . // Работа с файлом

fclose(f_my);

. . .

Для работы с текстовыми файлами в консольном приложении удобнее всего пользоваться функциями Fprintf() и Fscanf(), параметры и выполняемые действия аналогичны функциям Printf() и Scanf(), (см. лаб. раб.№1), только первым параметром добавлен указатель файла, к которому применяется данная функция.

Функции работы с текстовыми файлами удобны при создании результирующих файлов для отчетов по лабораторным и курсовым работам.

Для создания баз данных удобнее пользоваться функциями работы с бинарными файлами. Рассмотрим некоторые из них, обозначив указатель файла – Fp (FILE *Fp;):

1) int Fread(void *Ptv, int Size, int N, Fp) – считывает N блоков по Size байт каждый из файла Fp в область памяти, на которую указывает Ptv (необходимо заранее отвести память под считываемый блок);

2) int Fwrite(void *Ptv, int Size, int N, Fp) – записывает N блоков по Size байт каждый из области памяти, на которую указывает Ptv в файл Fp;

3) int Fileno(Fp) – возвращает значение Дескриптора файла Fp (дескриптор –число, определяющее номер файла);

4) long Filelength(int Дескриптор) – возвращает длину файла в байтах;

5) int Chsize(int Дескриптор, long Pos) – выполняет изменение размера файла Fp, признак конца файла устанавливается после байта с номером Pos;

6) int Fseek(Fp, long Size, int Kod) – выполняет смещение указателя на Size байт в направлении признака Kod: 0 – от начала файла; 1 – от текущей позиции; 2 – от конца файла;

7) long Ftell(Fp) – возвращает значение указателя на текущую позицию файла Fp (-1 – ошибка);

8) int Feof(Указатель файла) – возвращает ненулевое значение при правильной записи признака конца файла;

9) int Fgetpos(Указатель файла, long *Pos) – определяет значение текущей позиции Pos файла; при успешном завершении возвращает значение 0.

6.2. Пример выполнения задания

Написать программу обработки файла, содержащего информацию о рейтинге студентов. Каждая запись должна содержать Ф. И.О. и полученный балл рейтинга. Вывести информацию, отсортированную в порядке увеличения рейтинга. Результаты выполнения программы сохранить в текстовом файле. При работе с файлом должны быть выполнены следующие действия: создание, просмотр, добавление новой записи, сортировка, сохранение результатов.

Для создания текстового файла в консольном приложении используем функцию Fprintf(). Текст программы может иметь следующий вид:

. . .

#include <stdio. h>

#include <io. h>

. . .

Struct TZap{

char FIO[30];

double s_b;

} Zap;

Int size = sizeof(TZap);

FILE *Fz, *Ft;

Char File_Zap[] = "zapisi. dat";

Char File_Rez[] = "rezult. txt";

Void Out(TZap);

Void main()

{

int kod, D_f, i=0, j, kol;

long len;

TZap st, *mas_Z;

Ft = fopen(File_Rez, "w");

while(true) {

puts(" Create – 1 Add – 2 View – 3 Sort – 4 EXIT – 0");

scanf("%d", &kod);

switch(kod) {

case 1:

if ((Fz=fopen(File_Zap,"wb"))==NULL) {

puts(" Create ERROR!");

return;

}

fclose(Fz);

printf(" Create New File %s! ",File_Zap);

break;

case 2:

Fz = fopen(File_Zap,"ab");

printf(" F. I.O. – ");

fflush(stdin);

gets(Zap. FIO);

printf(" Ball – ");

scanf("%lf", &Zap. s_b);

fwrite(&Zap, size, 1, Fz);

fclose(Fz);

break;

case 3:

if ((Fz=fopen(File_Zap,"rb"))==NULL) {

puts(" Open ERROR!");

return;

}

// Вывод на экран

printf(" t——— Informations ———");

// Запись такой же информации в текстовый файл Ft

fprintf(Ft," t——— Informations ———");

while(1) {

if(!fread(&Zap, size,1,Fz)) break;

Out(Zap);

}

fclose(Fz);

break;

case 4:

Fz = fopen(File_Zap,"rb");

D_f = fileno(Fz);

len = filelength(D_f);

kol = len/size;

mas_Z = new TZap[kol];

// Считываем записи из файла в динамический массив

for (i=0; i < kol; i++)

fread((mas_Z+i), size, 1, Fz);

fclose(Fz);

printf(" t—— S O R T —— ");

fprintf(Ft," t—— S O R T —— ");

for (i=0; i < kol-1; i++)

for (j=i+1; j < kol; j++)

if (mas_Z[i].s_b > mas_Z[j].s_b) {

st = mas_Z[i];

mas_Z[i] = mas_Z[j];

mas_Z[j] = st;

}

for (i=0; i<kol; i++)

Out(mas_Z[i]);

delete []mas_Z;

break;

case 0:

fclose(Ft);

return;

}

}

}

//—————— Функция вывода одной записи на экран и в файл ———————

Void Out(TZap z)

{

printf(" %20s, %6.3lf.", z. FIO, z.s_b);

fprintf(Ft, " %20s, %6.3lf .", z. FIO, z. s_b);

}

Первоначально выбав пункт «1», создаем файл с именем Zapisi.Dat, который будет располагаться в текущем каталоге (созданной папке). Затем, выбирая пункт «2», последовательно вводим 4 записи. Выбрав пункт «3», просматриваем содержимое файла, а сортированные записи выведем на экран (запишем в файл), выбрав пункт «4». Результаты выполнения программы могут иметь вид:

6.3. Индивидуальные задания

Написать программу обработки файла типа запись, содержащую следующие пункты меню: «Создание», «Просмотр», «Коррекция» (добавление новых данных или редактирование старых), «Решение индивидуального задания».

Каждая запись должна содержать следующую информацию о студентах:

– фамилия и инициалы;

– год рождения;

– номер группы;

– оценки за семестр: по физике, математике, информатике, химии;

– средний балл.

Организовать ввод исходных данных, средний балл рассчитать по введенным оценкам.

Содержимое всего файла и результаты решения индивидувльного задания записать в текстовый файл.

1. Распечатать анкетные данные студентов, сдавших сессию на 8, 9 и 10.

2. Распечатать анкетные данные студентов-отличников, фамилии которых начинаются с интересующей вас буквы.

3. Распечатать анкетные данные студентов-отличников из интересующей вас группы.

4. Распечатать анкетные данные студентов, фамилии которых начинаются с буквы А, и сдавших математику на 8 или 9.

5. Распечатать анкетные данные студентов, имеющих оценки 4 или 5 по физике и оценку больше 8 по остальным предметам.

6. Распечатать анкетные данные студентов интересующей вас группы. Фамилии студентов начинаются с букв В, Г и Д.

7. Распечатать анкетные данные студентов, не имеющих оценок меньше 4 по информатике и математике.

8. Вычислить общий средний балл всех студентов и распечатать список студентов со средним баллом выше общего среднего балла.

9. Вычислить общий средний балл всех студентов и распечатать список студентов интересующей вас группы, имеющих средний балл выше общего среднего балла.

10. Распечатать анкетные данные студентов интересующей вас группы, имеющих неудовлетворительную оценку (меньше 4).

11. Распечатать анкетные данные студентов интересующей вас группы, имеющих оценку 9 или 10 по информатике.

12. Распечатать анкетные данные студентов, имеющих оценки 7 или 8 по физике и оценки 9 или 10 по высшей математике.

13. Вычислить общий средний балл студентов интересующей вас группы и распечатать список студентов этой группы, имеющих средний балл выше общего.

14. Распечатать анкетные данные студентов-отличников интересующей вас группы.

15. Распечатать анкетные данные студентов интересующей вас группы, имеющих средний балл выше введенного с клавиатуры.

16. Распечатать анкетные данные студентов интересующей вас группы, имеющих оценку 8 по физике и оценку 9 по высшей математике.

Оставить комментарий