Первый параметр filename - имя файла, который необходимо открыть. Имя файла может быть указано в виде:
· только имя файла - если файл находится в текущем рабочем каталоге программы;
· абсолютный (полный) путь к файлу;
· относительный путь к файлу.
Второй параметр mode - режим открытия файла (строка). Перечень возможных режимов открытия файлов в языке С приведен в таблице 7.1. Функция возвращает указатель на файловую переменную, если удалось открыть указанный файл в заданном режиме. В противном случае (если файл открыть не удалось) функция возвращает значение NULL.
Первый параметр filename - имя файла, с которым необходимо ассоциировать существующую файловую переменную (параметр stream). Второй параметр mode - режим открытия нового файла (см. таблицу 7.1). Третий параметр stream - существующий файловый поток, который необходимо ассоциировать с новым файлом.
Функция закрывает файл, ассоциированный со stream, открывает файл, указанный в filename, и ассоциирует stream с только что открытым файлом. Функция возвращает указатель на перенаправленный файловый поток, или значение NULL - если произошла ошибка. Данная функция обычно используется для перенаправления потоков stdin, stdout, stderr.
Функция создания временного файла:
FILE * tmpfile(void);
Функция создает временный файл и возвращает указатель на файловую переменную. Файл создается в режиме «wb+». В случае ошибки функция возвращает значение NULL. Файл уничтожается после его закрытия или после завершения программы.
Функция закрытия файла:
int fclose(FILE *stream);
В качестве параметра stream передается указатель на открытый ранее файловый поток. Функция осуществляет закрытие файла и возвращает значение ноль, если закрытие успешно и значение EOF (end of file, целочисленное значение: -1) - если нет.
Функция проверки достижения конца файла:
intfeof(FILE *stream);
В параметре stream передается указатель на файловый поток. Функция возвращает не нулевое значение, если достигнут конец файла и нулевое значение - если нет.
Рассмотрим функции чтения и записи текстовых файлов. Они очень похожи на стандартные функции ввода и вывода.
Функция форматированного ввода из файла:
int fscanf(FILE * restrict stream,
const char * restrictformat,
[argument] ...);
В первом параметре stream передается указатель на файловый поток, из которого необходимо произвести чтение. Остальные параметры функции аналогичны параметрам функции scanf. Функция возвращает количество успешно считанных и расположенных значений. В случае возникновения ошибки или достижения конца файла функция возвращает значение EOF.
Функция форматированного вывода в файл:
int fprintf(FILE * restrictstream,
const char * restrictformat,
[argument] ...);
В первом параметре stream передается указатель на файловый поток, в который необходимо вывести значения. Остальные параметры функции аналогичны параметрам функции printf. Функция возвращает количество выведенных символов в поток. В случае возникновения ошибки - отрицательное значение.
Функция чтения строки из файла:
char * fgets(char * restrictbuffer, intmaxlen,
FILE * restrictstream);
В первом параметре buffer передается указатель на буфер ввода (куда должна быть записана строка). Во втором параметре maxlen передается максимальное количество символов для считывания. В третьем параметре stream передается указатель на файловый поток, из которого необходимо произвести чтение. Функция осуществляет считывание строки в переменную buffer из потока stream до первого символа перевода строки (\n) или до конца файла. Если длина строки превышает указанное во втором параметре значение, то строка усекается. Символ перевода строки, если он присутствует, дописывается в конец считанной строки. Функция возвращает значение buffer или значение NULL, если произошла ошибка или была попытка чтения из конца файла.
Функция записи строки в файл:
int fputs(const char* restrictstring,
FILE * restrictstream);
В первом параметре string передается строка, которую необходимо записать в файл. Во втором параметре stream передается указатель на файловый поток, в который необходимо вывести строку. Функция возвращает положительное значение при успешном выполнении, и значение EOF - при ошибке.
Функция чтения символа из файла:
int fgetc(FILE *stream);
В параметре stream передается указатель на файловый поток, из которого необходимо прочитать символ. Функция возвращает код считанного символа (положительное значение) или значение EOF - если произошла ошибка или была произведена попытка чтения из конца файла.
Функция записи символа в файл:
int fputc(intc, FILE *stream);
В первом параметре c передается код символа, который необходимо записать в файл. Во втором параметре stream передается указатель на файловый поток, в который осуществляется запись символа. Функция возвращает код записанного символа, или EOF, если произошла ошибка.
ПРИМЕЧАНИЕ: Здесь приведены только основные функции ввода и вывода в текстовые файлы. В библиотеке stdio.h содержатся и другие функции, схожие по назначению.
Далее приведены функции чтения и записи в бинарные файлы.
Функция чтения данных из бинарного файла:
size_t fread(void * restrictbuffer, size_t size,
size_t num, FILE * restrictstream);
В первом параметре функции buffer передается указатель на буфер, куда должны быть записаны считанные из файла данные. Во втором параметре size передается размер (в байтах) одного значения. В третьем параметре num передается количество значений для считывания. Фактический объем данных, которые должны быть считаны, вычисляется путем перемножения второго и третьего параметров. В четвертом параметре stream передается указатель на файловый поток, из которого необходимо производить чтение данных. Функция считывает из файлового потока stream num значений, каждое из которых имеет размер size. Считанные значения располагаются последовательно в буфере buffer. Функция возвращает количество успешно считанных значений, которое может быть меньше чем num, если произошла ошибка или был достигнут конец файла.
Функция записи данных в бинарный файл:
size_t fwrite(const void * restrictbuffer,
size_t size, size_t num,
FILE * restrictstream);
В первом параметре функции buffer передается указатель на буфер, откуда должны быть записаны данные в файл. Во втором параметре size передается размер (в байтах) одного значения. В третьем параметре num передается количество значений для записи. Фактический объем данных, которые должны быть записаны, вычисляется путем перемножения второго и третьего параметров. В четвертом параметре stream передается указатель на файловый поток, в который необходимо производить запись данных. Функция записывает из буфера buffer в файловый поток stream num значений, каждое из которых имеет размер size. Функция возвращает количество успешно записанных значений, которое может быть меньше чем num, если произошла ошибка.
Помимо функций чтения и записи данных в файл на практике часто используются функции навигации (перемещения) по файлу.
Функция перехода к началу файла:
void rewind(FILE *stream);
В параметре stream передается указатель на файловую переменную, к началу файла которой необходимо перейти. Функция устанавливает текущую позицию в файле на начало файла.
Функция установки позиции в файле:
int fseek(FILE *stream, long intoffset, intorigin);
Первый параметр stream - указатель на файловую переменную, позицию, в файле которой, необходимо изменить. Второй параметр offset - смещение (в байтах), на которое необходимо установить позицию в файле. Третий параметр origin - указывает, откуда отсчитывать смещение:
· SEEK_SET (целочисленный код - 0) - от начала файла;
· SEEK_CUR (целочисленный код - 1) - от текущей позиции в файле;
· SEEK_END (целочисленный код - 2) - от конца файла.
Функция получения текущей позиции в файле:
long int ftell(FILE *stream);
В параметре stream передается указатель на файловую переменную, позицию в файле которой, необходимо получить. Функция возвращает текущее смещение в файле (в байтах) от начала файла. Если произошла ошибка, то значение -1.
Функция чтения текущей позиции в файле:
int fgetpos(FILE * restrictstream,
fpos_t * restrictpos);
Первый параметр stream - файловый поток, позицию которого в файле необходимо получить. Второй параметр pos - указатель на структуру fpos_t, куда будет помещена информация о позиции файлового потока в файле. Функция возвращает значение ноль при успешном выполнении и не нулевое значение при ошибке.
ПРИМЕЧАНИЕ: Структура fpos_t описана в библиотеке stdio.h.
Функция установки текущей позиции в файле:
int fsetpos(FILE *stream, const fpos_t *pos);
Первый параметр stream - файловый поток, позицию которого в файле необходимо установить. Второй параметр pos - указатель на структуру fpos_t, в которой содержится информация о новой позиции файлового потока в файле. Функция возвращает значение ноль при успешном выполнении и не нулевое значение при ошибке.
ПРИМЕЧАНИЕ: Функции fgetpos и fsetpos используются вместе. Сначала считывается текущая позиция в файле с помощью функции fgetpos, а затем, после проведения операций чтения и/или записи в файл, данная позиция может быть восстановлена с помощью функции fsetpos.
В языке С файловый поток может быть буферизированным или не буферизированным. Наличие буфера ввода означает, что поступающие данные помещаются сначала в буфер, а затем, по мере потребности, передаются в программы посредством функций ввода. Наличие буфера вывода означает, что записываемые в файл данные сначала помещаются в буфер, а затем, при заполнении буфера или при закрытии потока, записываются в файл. Отсутствие буферов означает, что ввод и вывод осуществляется напрямую в файл. Для управления буферами в библиотеке stdio.h языка С присутствует несколько функций.
Функция управления буфером:
void setbuf(FILE * restrictstream,
char * restrictbuffer);
Первый параметр stream - файловый поток, управление буфером которого осуществляется. Второй параметр buffer - указатель на область буфера. Если значение параметра buffer - NULL, то поток будет не буферизированным. В противном случае параметр buffer должен содержать указатель на область памяти размером BUFSIZ (мнемоническая константа, определенная в библиотеке stdio.h, стандартное значение 512). Устанавливать буфер ввода или вывода можно только до проведения операций чтения или записи данных в файловый поток (лучше сразу после его открытия).
Функция очистки буфера:
int fflush(FILE *stream);
В параметре stream передается указатель на файловый поток, буфер которого необходимо очистить. Если это поток вывода, то все данные, находящиеся в буфере, записываются в файл. Если это поток ввода, то все данные, находящиеся в буфере, уничтожаются. Функция не влияет на не буферизированные потоки. Если в качестве параметра передается значение NULL, то осуществляется очистка буферов всех буферизированных потоков. Функция возвращает значение ноль при успешном выполнении, в противном случае - значение EOF.
Также в библиотеке stdio.h реализованы две функции для работы с файлами на «верхнем» уровне (не используя файловый поток).
Функция удаления файла:
int remove(const char *filename);
В параметре filename указывается имя существующего файла, который необходимо удалить. Функция возвращает нулевое значение, если файл был успешно удален, в противном случае - значение -1.
Функция переименования файла:
int rename(const char *filename, const char *newname);
Первый параметр filename - имя существующего файла (или директории), который необходимо переименовать. Второй параметр newname - новое имя файла (или директории), файл с данным именем не должен существовать. Функция возвращает нулевое значение, если файл был успешно переименован, в противном случае - значение -1.