Поделиться через


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и stdoutstderr другим файлом.

Функция freopen_s закрывает файл, связанный с stream ним, и переназначает stream файл, указанный в pathфайле. _wfreopen_s — это версия функции freopen_s для расширенных символов; аргументы path и mode для функции _wfreopen_s представляют собой строки расширенных символов. Поведение_wfreopen_s и freopen_s идентично в противном случае.

Если какой-либо pFileиз , modepathили stream является NULLpath пустой строкой, эти функции вызывают обработчик недопустимых параметров, как описано в проверке параметров. Если выполнение может быть продолжено, эти функции устанавливают параметр errno в значение EINVAL и возвращают значение EINVAL.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H Обычной _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_tfreopen_s freopen_s freopen_s _wfreopen_s

freopen_s обычно используется для перенаправления заранее открытых файлов stdin, stdout и stderr на файлы, определенные пользователем. Новый файл, связанный с streammodeним, открывается с символьной строкой, указывающей тип доступа, запрошенный для файла, следующим образом:

mode Открыть
"r" Открывает для чтения. Если файл не существует или не удается найти, вызов завершается ошибкой freopen_s .
"w" Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется.
"a" Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Создает файл, если он не существует.
"r+" Открывает для чтения и записи. Файл должен существовать.
"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое удаляется.
"a+" Открывается для чтения и добавления. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается после завершения записи. Создает файл, если он не существует.

Используйте типы "w" и "w+" с осторожностью, поскольку они могут приводить к уничтожению существующих файлов. Начиная с C11, можно добавить "x""w" или "w+" вызвать сбой функции, если файл существует, а не перезаписывать его.

Если файл открывается с помощью типа доступа "a" или "a+", все операции записи выполняются в конце файла. Несмотря на то что указатель на файл может быть перемещен или fseekrewindуказатель на файл всегда перемещается обратно в конец файла перед выполнением любой операции записи. Таким образом, существующие данные не могут быть перезаписаны.

Режим "a" не удаляет маркер EOF перед добавлением в файл. После добавления команда MS-DOS TYPE отображает данные только до первоначального маркера EOF и не отображает данные, добавленные в файл. Перед добавлением в файл режим "a+" удаляет маркер конца файла. После добавления команда TYPE MS-DOS отображает все данные в файле. Режим "a+" необходим для добавления в потоковый файл, завершаемый маркером конца файла CTRL+Z.

Если задан тип доступа "r+", "w+" или "a+", чтение и запись разрешены (считается, что файл открыт для "обновления"). Однако при переключении между чтением и записью необходимо выполнить взаимодействие fsetposfseekили 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.

Обсуждение текстовых и двоичных режимов см. в разделе "Текст" и "Двоичный режим" в файле ввода-вывода.

Требования

Функция Обязательный заголовок
freopen_s <stdio.h>
_wfreopen_s <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows (UWP). Стандартные дескрипторы потока, связанные с консолью, stdinstdoutи 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