double arrow

Функция fclose


Лекция №8

9. ФАЙЛЫ

9.1. РАБОТА С ФАЙЛАМИ В ЯЗЫКЕ С

Открытие и закрытие файла

Открытие файла для ввода-вывода через поток выполняет функция fopen().

#include<stdio.h>

FILE*fopen(const char*filename,const char*mode)

Возвращает указатель на переменную типа FILE, описывающий открытый поток файлового ввода-вывода. Если невозможно открыть файл, функция возвращает NULL-указатель. Переменная filename-указатель на ASCIIZ-строку символов, задающую спецификацию открытого файла. Если не специфицируется буква накопителя, используется накопитель по умолчанию. Если не задан абсолютный маршрут, в качестве начального директория используется текущая рабочая директория выбранного накопителя. Переменная mode-указатель на ASCIIZ-строку символов, задающую режим открытия файла. Образуется комбинацией символов, приведенных в табл.3.1.

Табл.1. Символы задания режима открытия потока ввода-вывода

Знак Функция
r Файл открывается только для чтения. Так может быть открыт лишь уже существующий файл. Если файл с заданной спецификацией не существует, fopen() возвращает NULL. При успешном открытии указатель записи-чтения файла устанавливается в 0.
w Файл открывается только для записи с усечением. Если файл не существует, он создается в заданном параметром filename директории. Созданный файл имеет атрибут архивного файла. Если создать файл не удается, функция возвращает NULL. Если файл существует, но имеет атрибут "только читаемый", возвращается NULL. При успешном открытии указатель записи-чтения файла устанавливается в 0. По этой причине возможно переопределение содержимого существующего файла, если перед доступом к файлу не выполняется принудительная установка указателя. Если все предыдущее содержимое должно быть сохранено, можно либо сразу после открытия выполнить перемотку указателя на конец файла (см. далее), либо открыть файл в режиме пополнения содержимого – режиме "а". Попытка чтения из файла завершается возвратом ошибки функцией чтения. После закрытия файл имеет всегда "новый" размер, соответствующий текущему положению указателя записи-чтения. Поэтому открытие существующего файла и его немедленное закрытие усекают файл до нулевой длины.
a Файл открывается для пополнения. Все то же самое, что и для режима "w", но после открытия файла указатель записи-чтения устанавливается на позицию конца файла. В результате запись в файл происходит с сохранением предыдущего содержимого.
r+ Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечение файла: размер файла остается прежним, если текущий указатель записи-чтения файла состоит "левее" прежнего положения EOF. Сразу после открытия файла указатель устанавливается на начало файла.
w+ Файл открывается для обновления. Он доступен для чтения и записи, после закрытия существующий файл усекается. Если открываемый файл не существует, он создается в директории, задаваемом спецификацией файла. Сразу после открытия файла указатель записи-чтения файла устанавливается на начало файла. Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечения файла. Сразу после открытия файла указатель записи-чтения устанавливается на позицию EOF.
a+ Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия существующий файл не усекается. Сразу после открытия файла указатель записи-чтения устанавливается на позицию EOF.
b Файл открывается в двоичном режиме (см.3.1). Специализируется после r, w, a, r+, w+, a+, например "a+b". Для повышения мобильности программного кода предпочтительнее использовать управление двоичным или текстовым режимом через переменную _fmode, так как реализации Си для других ОС могут и не содержать параметров b или t при открытии файла.
t Файл открывается в текстовом режиме (см.3.1). Специализируется после r, w, a, r+, w+, a+, например “rt”.

Если данный файл открывается или создается в текстовом режиме, вы можете приписать символ t к значению параметра type (rt, w+t, и т.д.); аналогично, для спецификации бинарного режима вы можете к значению параметра type добавить символ b (wb, a+b, и т.д.).

Если в параметре type отсутствуют символы t или b, режим будет определяться глобальной переменной _fmode. Если переменная _fmode имеет значение O_BINARY, файлы будут открываться в бинарном режиме, иначе, если _fmode имеет значение O_TEXT, файлы открываются в текстовом режиме. Данные константы O_... определены в файле fcntl.h.

При открытии файла в режиме обновления (UPDATE), над результирующим потоком stream могут быть выполнены как операции ввода, так и вывода. Тем не менее вывод не может следовать непосредственно за вводом без вмешательства функций fseek или rewind. Также ввод, без применения функций fseek, rewind не может непосредственно следовать за выводом или вводом, который встречает конец файла (EOF).

Пример:

#include <stdio.h>

int main(void)

{

FILE *in, *out;

if((in = fopen("\\AUTOEXEC.BAT","rt"))==NULL)

{

fprintf(stderr, "Не могу открыть файл \n");

return(1);

}

if((out = fopen("\\AUTOEXEC.BAK","wt"))==NULL)

{

fprintf(stderr, "Не могу открыть выходной файл \n");

return(1);

}

while(!feof(in))

fputc(fgetc(in), out);

fclose(in);

fclose(out);

return 0;

}

Функция fclose

Функция

#include <stdio.h>

int fclose (FILE * stream);

закрывает указанный поток stream. Все буфера, связанные с потоком stream, перед закрытием сбрасываются. Буфера, размещенные системой, освобождаются во время процесса закрытия. Буфера, назначенные функциями setbuf или setvbuf, не освобождаются автоматически. (Однако, если в качестве указателя, функции setvbuf передать 0, то он будет освобожден при закрытии потока.)

Функция fclose при успешном завершении возвращает 0. Если были обнаружены какие-либо ошибки, функция fclose возвращает значение EOF.

Пример:

#include<string.h>

#include<stdio.h>

int main(void)

{

FILE *fp;

char buf[11] = "0123456789";

/* создать файл содержащий 10 байт */

fp = fopen("DUMMY.FIL","w");

if(fp)

{

fwrite(&buf,strlen(buf),1,fp);

/* закрыть файл */

fclose(fp);

}

else

{

printf("Ошибка, при открытии файла\n");

}

return 0;

}


Сейчас читают про: