- •Кафедра ”Информационных систем управления”
- •Основные типы данных, операции и выражения, форматный ввод-вывод данных. Линейные и разветвляющиеся алгоритмы Методические указания
- •Пример программы
- •Контрольные вопросы
- •Решение задач с использованием циклических алгоритмов. Обработка числовых и символьных массивов Методические указания
- •Примеры программ
- •Контрольные вопросы
- •Работа с файлами. Использование процедур и функций Методические указания
- •Пример задания
- •Контрольные вопросы
- •Динамическое управление памятью. Методические указания
- •Примеры программ
- •Контрольные вопросы
Работа с файлами. Использование процедур и функций Методические указания
При выполнении лабораторной работы приобретаются навыки работы с файлами. Исходные данные следует сохранять в структурах. Для сохранения и работы с информацией в программе следует создать файл, в который будут записываться структуры. Результаты работы программы, кроме вывода на экран, следует сохранить в текстовом файле с последующим выводом его содержимого на принтер.
В соответствии с полученным вариантом задания следует:
Составить блок-схему решения задачи на уровне процедур и функций. Блок-схема должна отражать логическую структуру алгоритма.
По разработанному алгоритму написать программу, удовлетворяющую следующим требованиям:
- в программу необходимо включить меню работы с программой, которое должно содержать следующие пункты:
а) создание файла исходных данных;
б) просмотр содержимого файла;
в) поиск заданной информации в файле;
г) корректировка информации в файле (дозапись информации в файл, удаление информации из файла, изменение значения компонент файла);
д) выход из программы;
- алгоритм, соответствующий каждому пункту меню, должен быть реализован в виде функции. Входные данные для работы функций и результаты их работы следует передавать через параметры функций. Не следует все переменные программы описывать как глобальные объекты;
- перемещение по пунктам меню можно организовать с помощью клавиш <стрелка вверх> и <стрелка вниз> или вводом номера выбранного пункта меню;
- предусмотреть ввод информации в файл из заранее подготовленного текстового файла. Для этого в текстовом редакторе системы заранее набрать входную информацию и сохранить ее в файле исходных данных;
- пользовательские типы можно описывать с помощью спецификатора typedef;
- если при корректировке файлов создавались вспомогательные файлы, их необходимо удалить после работы программы.
Пример задания
Описать в виде структуры зачетную книжку студента. Записать в файл содержимое зачетных книжек некоторой группы студентов. После сессии добавить в файл результаты сдачи экзаменов студентами. Исключить из файла сведения о студентах, не сдавших сессию.
Зачетную книжку студента и файл, содержащий сведения о студентах группы, опишем следующим образом:
#include <stdio.h>
typedef struct {
char subject[30];
unsigned short int mark;
} examination;
typedef examination sessia[5];
typedef sessia setofsessia[10];
typedef struct {
long number;
char name[60];
char groupcode[8];
setofsessia marks;
} studcard;
studcard rec;
FILE *f;
Таким образом, структура объединяет в единое целое любое число полей данных разных типов. Чтобы присвоить значение переменной типа структура, нужно присвоить значения всем полям структуры. Ввод и вывод информации в файл при выполнении лабораторной работы осуществлять блоками, размер которых кратен размеру структуры (функции fread и fwrite).
Для работы с файлом его надо открыть, обработать и закрыть. При открытии файла программы с ним связывается определенный физический поток (физический файл). Файл должен иметь указатель на структуру типа FILE (этот тип определён в файле stdio.h). Когда файл открывается с помощью функции fopen, структуре типа FILE выделяется память, адрес которой получает указатель на структуру, и поток связывается со структурой типа FILE. Структура содержит информацию о файле или устройстве, с которым связан файл программы. Указатель типа FILE используется для операций с файлами с помощью библиотечных функций ввода-вывода. Открытие файла производится функцией fopen. Прототип функции
FILE * fopen(char *filename, char *type);
где filename – определяет полное имя физического файла;
type определяет способ (режимы) доступа к файлу.
Допустимые значения способов доступа
Способ доступа |
Назначение способа доступа – открыть файл для |
“r” “w”
“a”
“+” |
read – чтения; файл должен быть уже создан write – записи; если был файл с тем же именем, он стирается при открытии файла append – дополнение записей в конец файла; если файла нет, он создается - допускается чтение из файла и запись в файл |
Примеры операторов открытия файлов:
FILE *Fid=fopen(“lr2.dat”,”r”);//для чтения
FILE *Fin=fopen(filename,”a+”);//для чтения и дополнения
Если файл открыт с режимом “a” или ”a+”, данные записываются в конец файла, даже если указатель файла был перемещён от конца файла с помощью функций fseek и rewind: при записи в файл указатель перемещается в конец файла.
Для режимов “r+”, ”w+” и ”a+” разрешены чтение и запись, так как файл открыт для обновления.
Для текстового режима в строке type должен быть символ t, для бинарного – b. Например, “wb” или “wt”.
При вводе-выводе данных записями в текстовом режиме значения пересылаемых данных, совпадающие с управляющими кодами (например, конца файла), могут нарушить процесс обмена записями. Поэтому при вводе-выводе данных записями надо использовать бинарные режимы доступа.
Если открытие файла успешно, функция fopen возвращает значение – указатель на переменную типа FILE и связывает файл программы с физическим файлом, а если открытие не состоялось (например, файл с таким именем не найден), функция возвращает NULL.
Следующая функция осуществляет проверку наличия на диске файла с данным именем:
#include<stdio.h>
int fileexists(char *filename)
{
FILE *f=fopen(filename,"r");
if(f==NULL)return 0;
else return 1;
}
Очистить существующий или создать новый дисковый файл позволяет следующая функция:
#include<stdio.h>
void cleanfile(char *filename)
{
FILE *f=fopen(filename,"w");
fcloseall();
return;
}
Функция fclose закрывает один заданный поток (файл). Функция fcloseall закрывает все потоки, открытые с помощью функций fopen.При этом буфер, образованный при открытии файла, ликвидируется.
Переименовать дисковый файл можно с помощью функции rename:
int rename(const char *oldname, const char *newname);
Для уничтожения файла используется процедура remove:
int remove(const char *filename);
Переименовывать и удалять можно только закрытые файлы.