Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Скачать 319.62 Kb.
|
Работа с файламиОбщие приёмы работы с файламиПрограмма, которая не сохраняет результаты своей работы, очевидно, не очень-то и нужна. Мы научимся создавать файлы, записывать в них информацию, и затем считывать ее обратно в программу. В стандартной библиотеке языка Си предусмотрены функции для работы с файлами. Для работы с ними необходимо подключить заголовочный файл <stdio.h>. Работа с файлами складывается из трех шагов: открыть файл; работать с файлом; закрыть файл. Рассмотрим эти шаги подробнее. 1. Файл открывается. Это означает, что программа "захватывает" заданный по имени файл, сообщает операционной системе, что далее она будет с ним работать. Данный шаг нужен, чтобы не возникало конфликтов, когда несколько программ одновременно хотят записывать информацию в один и тот же файл. Правда, считывать данные из файла, очевидно, допустимо одновременно множеством программ, поэтому в операции открытия файла обычно уточняется, что файл открывается "на чтение" (считывание информации, которая не меняется) либо "на запись" (данные в файле модифицируются). Функция открытия файла имеет следующий прототип (здесь и далее пропущены некоторые платформенные особенности прототипов): FILE * fopen (const char *filename, const char * mode) errno_t fopen_s(FILE** pFile, const char *filename, const char *mode); Эта функция передаёт запрос на открытие файла операционной системе. Операционная система при открытии файла для некоторой программы сообщает ей (программе) идентификатор (как правило, целое число), которое идентифицирует в программе в дальнейшем нужный открытый файл. Этот идентификатор запоминается в переменной; обычно такая переменная называется файловой переменной. Файловая переменная в стандартной библиотеке языка Си представляет собой структуру типа FILE и помимо идентификатора файла хранит также дополнительные данные о текущем состоянии работы с файлом. Её часто называют дескриптором файла. Функция fopen возвращает указатель на динамически созданную структуру типа FILE. Параметров у функции fopen() два. Первый – это путь к файлу (строка), второй -- параметры открытия файла. Используются следующие способы открытия файла:
2. Ведется работа с файлом. Из него данные либо считываются, либо в него записываются. Приёмы работы с файлом зависят от типа контента файла и будут рассмотрены далее. 3. Файл закрывается. После этой операции он снова доступен другим программам для обработки. Функция закрытия файла имеет следующий прототип: int fclose (FILE *stream); int _fcloseall( void ); При вызове функции fclose нужно передать указатель на дескриптор ранее открытого файла. Вызов функции fclose приводит к закрытию потока данных, на который указывает аргумент stream, сбросу остаточного содержимого буфера данных в файл (если в буфере оставались данные), освобождению памяти выделенной под буфера чтения и записи (если буфера создавались) и закрытию файла связанного с потоком данных. В случае успешной работы функция возвращает 0. Если во время работы функции возникла ошибка, то она возвращает EOF (-1), при этом в дескриптор файла будет присвоен код ошибки, которую затем можно определить, используя функцию ferror. Вот список некоторых дополнительных полезных функций для работы с файлами: int feof (FILE *stream); //проверка достижения конца файла int fseek(FILE *stream, long offset, int origin); //позиционирование int ferror(FILE *stream); // возвращает текущий код ошибки void clearerr (FILE* stream); // сбрасывает признак ошибки в 0 // записывает в pposition текущую позицию курсора в файле int fgetpos(FILE* stream, fpos_t* pposition); // устанавливает курсор в файле в позицию из pposition int fsetpos (FILE*stream, const fpos_t* pposition); |