freopen(), freopen64()

Заново открыть поток

Прототип:

#include <stdio.h>
FILE * freopen( const char *filename,
const char *mode,
FILE *fp );
FILE * freopen64( const char *filename,
const char *mode,
FILE *fp );

Аргументы:

filename
Имя файла, который нужно открыть.
mode
Режим, который будет использоваться для открытия файла. Для дополнительной информации смотрите fopen().
fp
Поток, ассоциированный с файлом.

Библиотека:

libc

Описание:

Функции freopen() и freopen64() закрывают открытый поток fp, открывают файл, определяемый filename, и ассоциируют этот поток с fp.

Наибольшее значение, которое может быть корректно представлено в объекте типа off_t - максимальное смещение в описании открытого файла.

(расширение ЗОСРВ «Нейтрино») Допустимы следующие изменения режима:

Возвращаемое значение:

Указатель на новый открытый поток. Если возникла ошибка или достигнут конец файла, функция возвращает NULL, код ошибки записывается в errno.

Коды ошибок:

EACCES
Для части префикса filename отсутствует право поиска, или файл существует и права, определенные mode, отсутствуют, или файл не существует и право на запись для родительской директории, в которой создается файл, отсутствует.
EBADF
Файловый дескриптор некорректен или не поддерживает запрашиваемое изменение режима.
EBADFSYS
Файл или часть префикса filename были повреждены во время попытки открытия указанного файла. Системный сбой, автоматическое восстановление после которого невозможно, возник во время записи файла или обновления директории. Следует вызвать соответствующие системно-административные процедуры для исправления ситуации перед продолжением.
EBUSY
Доступ к файлу запрещен из-за конфликта открытия (смотрите sopen()).
EINTR
Операция freopen() была прервана сигналом.
EINVAL
Значение аргумента mode некорректно.
EISDIR
Указанный файл является директорией, а аргумент mode определяет доступ только для чтения или чтения/записи.
ELOOP
Слишком большой уровень символических ссылок или префиксов.
EMFILE
В данный момент процесс использует слишком много файловых дескрипторов.
ENAMETOOLONG
Длина строки filename превышает PATH_MAX или часть пути к файлу длиннее, чем NAME_MAX.
ENFILE
В данный момент в системе открыто слишком много файлов.
ENOENT
Указанный файл или префикс filename не существуют, или аргумент filename указывает на пустую строку.
ENOMEM
Нет свободной памяти для структуры FILE.
ENOSPC
Директория или файловая система, в которой будет располагаться новый файл, не может быть расширена.
ENOSYS
Функция freopen() не реализована для файловой системы, в которой находится filename.
ENOTDIR
Часть префикса filename не является директорией.
ENXIO
Устройство, ассоциированное с файлом, было удалено (например, CD или гибкий диск).
EOVERFLOW
Указанный файл является обычным, и его размерне может быть корректно представлен в объекте типа off_t.
EROFS
Указанный файл находится в файловой системе, доступной только для чтения.

Примеры:

#include <stdio.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
int c;
/*
* Reopen the stdin stream so it's reading
* from "file" instead of standard input.
*/
fp = freopen( "file", "r", stdin );
if ( fp != NULL )
{
/* Now we can read from "file" using the
* stdin functions like fgetchar()... */
while( ( c = fgetchar() ) != EOF )
{
fputchar( c );
}
fclose( fp );
return (EXIT_SUCCESS);
}
return (EXIT_FAILURE);
}

Классификация:

freopen() — ANSI, POSIX 1003.1; freopen64() — Поддержка больших файлов

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

errno, fclose(), fcloseall(), fdopen(), fopen(), fopen64()




Предыдущий раздел: Описание API системной библиотеки