freopen_s
, _wfreopen_s
Закрывает файл, связанный с oldStream
ним, и переназначает stream
файл, указанный в fileName
файле.
Эти версии имеют _wfreopen
улучшения безопасности, как описано в функциях freopen
безопасности в CRT.
Синтаксис
errno_t freopen_s(
FILE ** stream,
const char * fileName,
const char * mode,
FILE* oldStream
);
errno_t _wfreopen_s(
FILE ** stream,
const wchar_t * fileName,
const wchar_t * mode,
FILE * oldStream
);
Параметры
stream
Параметр out, указывающий на повторно открытый поток при возврате функции.
fileName
Путь к файлу для повторного открытия.
mode
Режим повторного открытия потока.
oldStream
Поток для повторного открытия. Он очищается и все файлы, связанные с ним, закрываются.
Возвращаемое значение
Ноль успеха; в противном случае код ошибки. Если возникает ошибка, исходный файл закрывается и NULL
записывается stream
в нее, если stream
не также NULL
Дополнительные сведения об кодах ошибок см. в разделе errno
, _doserrno
_sys_errlist
и _sys_nerr
.
Замечания
Функция freopen_s
обычно используется для присоединения предварительно открытых потоков, связанных с stdin
и stdout
stderr
другим файлом.
Функция freopen_s
закрывает файл, связанный с stream
ним, и переназначает stream
файл, указанный в path
файле. _wfreopen_s
— это версия функции freopen_s
для расширенных символов; аргументы path
и mode
для функции _wfreopen_s
представляют собой строки расширенных символов. Поведение_wfreopen_s
и freopen_s
идентично в противном случае.
Если какой-либо pFile
из , mode
path
или stream
является NULL
path
пустой строкой, эти функции вызывают обработчик недопустимых параметров, как описано в проверке параметров. Если выполнение может быть продолжено, эти функции устанавливают параметр errno
в значение EINVAL
и возвращают значение EINVAL
.
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Сопоставления подпрограмм универсального текста
TCHAR.H рутина |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_tfreopen_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s
обычно используется для перенаправления заранее открытых файлов stdin
, stdout
и stderr
на файлы, определенные пользователем. Новый файл, связанный с stream
mode
ним, открывается с символьной строкой, указывающей тип доступа, запрошенный для файла, следующим образом:
mode |
Открыть |
---|---|
"r" |
Открывает для чтения. Если файл не существует или не удается найти, вызов завершается ошибкой freopen_s . |
"w" |
Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется. |
"a" |
Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Создает файл, если он не существует. |
"r+" |
Открывает для чтения и записи. Файл должен существовать. |
"w+" |
Открывает пустой файл для чтения и записи. Если файл существует, его содержимое удаляется. |
"a+" |
Открывается для чтения и добавления. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается после завершения записи. Создает файл, если он не существует. |
Используйте типы "w"
и "w+"
с осторожностью, поскольку они могут приводить к уничтожению существующих файлов. Начиная с C11, можно добавить "x"
"w"
или "w+"
вызвать сбой функции, если файл существует, а не перезаписывать его.
Если файл открывается с помощью типа доступа "a"
или "a+"
, все операции записи выполняются в конце файла. Несмотря на то что указатель на файл может быть перемещен или fseek
rewind
указатель на файл всегда перемещается обратно в конец файла перед выполнением любой операции записи. Таким образом, существующие данные не могут быть перезаписаны.
Режим "a"
не удаляет маркер EOF перед добавлением в файл. После добавления команда MS-DOS TYPE отображает данные только до первоначального маркера EOF и не отображает данные, добавленные в файл. Перед добавлением в файл режим "a+"
удаляет маркер конца файла. После добавления команда TYPE MS-DOS отображает все данные в файле. Режим "a+"
необходим для добавления в потоковый файл, завершаемый маркером конца файла CTRL+Z.
Если задан тип доступа "r+"
, "w+"
или "a+"
, чтение и запись разрешены (считается, что файл открыт для "обновления"). Однако при переключении между чтением и записью необходимо выполнить взаимодействие fsetpos
fseek
или rewind
операцию. Текущую позицию можно указать для fsetpos
операции или fseek
, если требуется. Помимо вышеуказанных значений один из следующих символов может быть включен в строку mode
для определения режима преобразования новых строк.
mode модификатор |
Режим перевода |
---|---|
t |
Откройте файл в текстовом (переведенном) режиме. |
b |
Откройте в двоичном (нетрансляционном) режиме; переводы, включающие символы канала каретки и строки, подавляются. |
В режиме перевода текста сочетания канала возврата каретки (CR-LF) превратятся в символы однострочного канала (LF) для входных данных; Символы LF претворяются в сочетания CR-LF для выходных данных. Кроме того, при вводе символ CTRL+Z интерпретируется как символ конца файла. В файлах, открытых для чтения или для чтения и записи с "a+"
, библиотека времени выполнения проверяет на CTRL+Z в конце файла и удаляет его, если это возможно. Он удален из-за использования fseek
и ftell
перемещения в файл может привести fseek
к неправильному ведении в конце файла. Не используйте t
этот параметр, если требуется переносимость ANSI, так как это расширение Майкрософт.
Если t
или b
нет mode
, режим перевода по умолчанию определяется глобальной переменной _fmode
. Если символ t
или b
указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL
.
Обсуждение текстовых и двоичных режимов см. в разделе "Текст" и "Двоичный режим" в файле ввода-вывода.
Требования
Function | Обязательный заголовок |
---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> или <wchar.h> |
Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью, stdin
stdout
и stderr
, должны быть перенаправлены перед тем, как функции времени выполнения C могут использовать их в приложениях UWP.
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_freopen_s.c
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.
#include <stdio.h>
#include <stdlib.h>
FILE *stream;
int main( void )
{
errno_t err;
// Reassign "stderr" to "freopen.out":
err = freopen_s( &stream, "freopen.out", "w", stderr );
if( err != 0 )
fprintf( stdout, "error on freopen\n" );
else
{
fprintf( stdout, "successfully reassigned\n" );
fflush( stdout );
fprintf( stream, "This will go to the file 'freopen.out'\n" );
fclose( stream );
}
system( "type freopen.out" );
}
successfully reassigned
This will go to the file 'freopen.out'
См. также
Stream I/O
freopen
, _wfreopen
fclose
, _fcloseall
_fdopen
, _wfdopen
_fileno
fopen
, _wfopen
_open
, _wopen
_setmode