Этот тип данных определяет поток и содержит информацию, необходимую для управления потоком, в том числе указатель на буфер потока, и его показатели состояния.
Файловые объекты обычно создаются с помощью вызова функций fopen или tmpfile , которые возвращают ссылку на объект связанный с файлом.
Содержимое объекта FILE предназначено для использования только функций определённых в заголовочном файле . В самом деле, основной целью объекта типа FILE является идентификации и потока, который связан с физическим файлом. Во всех потоковых функциях, в качестве аргумента передается объект типа FILE , таким образом мы можем передавать потоки в функции, и выполнять различные манипуляции с ними.
Объект типа FILE в памяти размещается автоматически, эта задача лежит на функциях fopen или tmpfile . Задача высвобождения памяти выполняется функцией fclose .
При подключении заголовочного файла в проект, автоматически создаются три объекта типа FILE* , потоки ввода/вывода и стандартный поток ошибок. К этим потокам можно обратиться через указатели stdin , stdout и stderr .
Программирование на Си урок 37: Работа с файлами в языке Си
Пример: исходный код программы
//пример использования FILE #include int main() < char buffer[100]; FILE * ptrFile = fopen(«file.txt» , «r»); if (ptrFile == NULL) perror («Ошибка открытия файла»); else < while ( !feof(ptrFile) ) // пока не конец файла < if ( fgets(buffer , 100 , ptrFile) != NULL ) // считать символы из файла fputs(buffer, stdout); // вывод на экран >fclose (ptrFile); // закрыть файл > return 0; >
Эта программа считывает данные из текстового файла file.txt и отправляет считанные данные в стандартный поток вывода.
CppStudio.com
Цитата из фантастического фильма «Хроники Риддика»:
«Нет будущего, пока мы не разберемся в нашем прошлом.»
Что-то в этой цитате есть, что заставляет задуматься, не помню, кто это сказал, но в этом предложении заложен глубокий смысл.
Источник: cppstudio.com
18. Файлы в языке Си
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое. В файлах размещаются данные, предназначенные для длительного хранения. Различают два вида файлов: текстовые и бинарные. Текстовые файлы представляют собой последовательность ASCII символов и могут быть просмотрены и отредактированы с помощью любого текстового редактора. Бинарные (двоичные) файлы представляют собой последовательность данных, структура которых определяется программно. В языке Си имеется большой набор функций для работы с файлами, большинство которых находятся в библиотеках stdio.h и io.h .
18.1. Открытие файла
Каждому файлу присваивается внутреннее логическое имя, используемое в дальнейшем при обращении к нему. Логическое имя (идентификатор файла) – это
указатель на файл, т.е. на область памяти, где содержится вся необходимая информация о файле. Формат объявления указателя на файл следующий:
Язык Си для начинающих / #9 — Работа с файлами
FILE * указатель на файл ; | |
FILE – идентификатор структурного типа, описанный в стандартной библиотеке | |
stdio.h и содержащий следующую информацию: | |
type struct | |
short level; | – число оставшихся в буфере непрочитанных байт; |
обычный размер буфера – 512 байт; как только level=0, | |
в буфер из файла читается следующий блок данных; | |
unsigned flags; | – флаг статуса файла – чтение, запись, дополнение; |
char fd; | – дескриптор файла, т.е. число, определяющее его но- |
мер; | |
unsigned char hold; | – непереданный символ, т.е. ungetc-символ; |
short bsize; | – размер внутреннего промежуточного буфера; |
unsigned char buffer; | – значение указателя для доступа внутри буфера, т.е. |
задает начало буфера, начало строки или текущее зна- | |
чение указателя внутри буфера в зависимости от режи- | |
ма буферизации; | |
unsigned char *curp; | – текущее значение указателя для доступа внутри бу- |
фера, т.е. задает текущую позицию в буфере для обме- | |
на с программой; | |
unsigned istemp; | – флаг временного файла; |
short token; | – флаг при работе с файлом; |
> FILE ; |
Прежде чем начать работать с файлом, т.е. получить возможность чтения или записи информации в файл, его нужно открыть для доступа. Для этого обычно используется функция FILE* fopen ( char * имя _ файла , char * режим ); она берет внешнее представление – физическое имя файла на носителе (дискета, винчестер) и ставит ему в соответствие логическое имя.
Физическое имя, т.е. имя файла и путь к нему задается первым параметром – строкой, например, “a:Mas_dat.dat” – файл с именем Mas_dat.dat, находящийся на дискете, “d:\work\Sved.txt” – файл с именем Sved.txt, находящийся на винчестере в каталоге work. Внимание! Обратный слеш (), как специальный символ, в строке записывается дважды.
При успешном открытии функция fopen возвращает указатель на файл (в дальнейшем – указатель файла). При ошибке возвращается NULL . Данная ситуация обычно возникает, когда неверно указывается путь к открываемому файлу. Например, если в дисплейном классе нашего университета указать путь, запрещенный для записи (обычно разрешенным является d:work). Второй параметр – строка, в которой задается режим доступа к файлу:
w – файл открывается для записи; если файла с заданным именем нет, то он будет создан; если такой файл существует, то перед открытием прежняя информация уничтожается; r – файл открывается только для чтения; если такого файла нет, то возникает ошибка; a – файл открывается для добавления в конец новой информации; r+ – файл открывается для редактирования данных – возможны и запись, и чтение информации; w+ – то же, что и для r+; a+ – то же, что и для a, только запись можно выполнять в любое место файла; доступно и чтение файла; t – файл открывается в текстовом режиме; b – файл открывается в двоичном режиме. Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов «перевод строки», «возврат каретки» заменяется на один символ: «перевод строки» для всех функций записи данных в файл, а для всех функций вывода символ «перевод строки» теперь заменяется на два символа: «перевод строки», «возврат каретки». По умолчанию файл открывается в текстовом режиме. Пример: FILE *f; – объявляется указатель на файл f; f = fopen («d:\work\Dat_sp.cpp», «w»); – открывается для записи файл с логическим именем f, имеющим физическое имя Dat_sp.cpp, находящийся на диске d, в каталоге work; или более кратко FILE *f = fopen («d:\work\Dat_sp.cpp», «w»);
18.2. Закрытие файла
После работы с файлом доступ к нему необходимо закрыть. Это выполняет функция int fclose ( указатель файла ). Например, из предыдущего примера файл закрывается так: fclose (f); Для закрытия нескольких файлов введена функция, объявленная следующим образом: void fcloseall ( void ); Если требуется изменить режим доступа к файлу, то для этого сначала необходимо закрыть данный файл, а затем вновь его открыть, но с другими правами доступа. Для этого используют стандартную функцию: FILE* freopen (char* имя_файла , char * режим , FILE * указатель_файла ); Эта функция сначала закрывает файл, объявленный указателем_файла (как это делает функция fopen ), а затем открывает файл с именем_файла и правами доступа « режим ». В языке Си имеется возможность работы с временными файлами, которые нужны только в процессе работы программы. В этом случае используется функция FILE* tmpfile (void);
которая создает на диске временный файл с правами доступа «w+b», после завершения работы программы или после закрытия временного файла он автоматически удаляется.
18.3. Запись – чтение информации
Все действия по чтению-записи данных в файл можно разделить на три группы: операции посимвольного ввода-вывода; операции построчного вводавывода; операции ввода-вывода по блокам. Рассмотрим основные функции, применяемые в каждой из указанных трех групп операций. Посимвольный ввод-вывод В функциях посимвольного ввода-вывода происходит прием одного символа из файла или передача одного символа в файл:
int fgetc (FILE *f) | – считывает и возвращает символ из файла f; |
int fputc ( int ch, FILE *f) | – записывает в файл f код ch символа. |
Построчный ввод-вывод В функциях построчного ввода-вывода происходит перенос из файла или в
файл строк символов: | |
int fgets ( char *S, int m, FILE *f) | – чтение из файла f в строку S m байт; |
int fputs ( char *S, FILE *f) | – запись в файл f строки S до тех пор, пока |
не встретится ‘ |