Лабораторная работа №8. Обработка структур с использованием файлов
Цель работы: изучить правила создания и обработки данных структурного типа с использованеием файлов; правила работы с компонентами OpenDialog и SaveDialog; написать и отладить программу по созданию файлов.
Теоретические сведения
Структура объединяет логически связанные данные разных типов. Структурный тип данных определяется описанием шаблона:
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(“\n Ошибка открытия файла!”);
// В оконном режиме – ShowMessage("Ошибка открытия файла");
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) intfseek(fp, long size, int kod) – выполняет смещение указателя на size байт в направлении признака kod: 0 – от начала файла; 1 – от текущей позиции; 2 – от конца файла;
7) long ftell(fp) – возвращает значение указателя на текущую позицию файла fp (-1 – ошибка);
8) intfeof(указатель файла) – возвращает ненулевое значение при правильной записи признака конца файла;
9) intfgetpos(указатель файла, long *pos) – определяет значение текущей позиции pos файла; при успешном завершении возвращает значение 0.
Дата добавления: 2022-02-05; просмотров: 265;