Заново открыть поток
#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
- максимальное смещение в описании открытого файла.
(расширение ЗОСРВ «Нейтрино») Допустимы следующие изменения режима:
- w → a
- a → w
- r+ → r
- r+ → w
- r+ → a
- r+ → w+
- r+ → a+
- w+ → r
- w+ → w
- w+ → a
- w+ → r+
- w+ → w+
- w+ → a+
- a+ → r
- a+ → w
- a+ → a
- a+ → r+
- a+ → w+
Указатель на новый открытый поток. Если возникла ошибка или достигнут конец файла, функция возвращает 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;
fp = freopen( "file", "r", stdin );
if ( fp != NULL )
{
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 системной библиотеки