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


freopen_s, _wfreopen_s

Переназначает указатель файла. В этих версиях freopen, _wfreopen усовершенствована безопасность, как описано в разделе Функции безопасности в CRT.

errno_t freopen( 
   FILE** pFile,
   const char *path,
   const char *mode,
   FILE *stream 
);
errno_t _wfreopen( 
   FILE** pFile,
   const wchar_t *path,
   const wchar_t *mode,
   FILE *stream 
);

Параметры

  • [исходящий] pFile
    Указатель на указатель файла, который будет предоставлен вызовом.

  • [входящий] path
    Путь к новому файлу.

  • [входящий] mode
    Тип разрешенного доступа.

  • [входящий] stream
    Указатель на структуру FILE.

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

Каждая из этих функций возвращает код ошибки. При возникновении ошибки исходный файл закрывается.

Заметки

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

Если любой из аргументов pFile, path, mode или stream равен NULL или если path является пустой строкой, эти функции активируют обработчик недопустимого параметра, как описано в разделе Проверка параметров. Если продолжение выполнения разрешено, эти функции устанавливают для errno значение EINVAL и возвращают EINVAL.

Универсальное текстовое сопоставление функций

Подпрограмма TCHAR.H

_UNICODE & _MBCS не определены

_MBCS определено

_UNICODE определено

_tfreopen_s

freopen_s

freopen_s

_wfreopen_s

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

  • "r"
    Открывает для чтения. Если файл не существует или его невозможно найти, вызов freopen_s завершается ошибкой.

  • "w"
    Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется.

  • "a"
    Открывает для записи в конце файла (добавление) без удаления маркера конца файла перед записью новых данных в файл; создает файл, если он не существует.

  • "r+"
    Открывает для чтения и записи. (Файл должен существовать.)

  • "w+"
    Открывает пустой файл для чтения и записи. Если указанный файл существует, его содержимое удаляется.

  • "a+"
    Открывает для чтения и добавления; операция добавления включает в себя удаление маркера конца файла до записи новых данных в файл и восстановление маркера конца файла после завершения записи; создает файл, если он не существует.

Используйте типы "w" и "w+" с осторожностью, поскольку они могут удалить существующие файлы.

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

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

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

  • t
    Открыть в текстовом режиме; сочетания символов возврата каретки и перевода строки преобразуются в один символ перевода строки на входе, а символы перевода строки преобразуются на выходе в сочетания символов возврата каретки и перевода строки. Также CTRL+Z интерпретируется как символ конца файла на входе. В файлах, открытых для чтения или для чтения и записи с "a+", библиотека времени выполнения проверяет на CTRL+Z в конце файла и удаляет его, если это возможно. Это делается потому, что использование fseek и ftell для перемещения в файле, который заканчивается CTRL+Z, может вызвать неправильное поведение fseek ближе к концу файла. Параметр t представляет собой расширение Майкрософт и не должен использоваться, если требуется обеспечить переносимость ANSI.

  • b
    Открытие файл в бинарном (непреобразованном) режиме; вышеописанные преобразования отключены.

Если символ t или b в параметре mode не указан, режим преобразования по умолчанию определяется глобальной переменной _fmode. Если символ t или b указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL.

Обсуждение текстового и бинарного режимов см. в разделе Text and Binary Mode File I/O.

Требования

Функция

Обязательный заголовок

freopen_s

<stdio.h>

_wfreopen_s

<stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях Магазин Windows. Стандартные дескрипторы потока, связанные с консолью — stdin, stdout и stderr — необходимо перенаправить, чтобы функции C времени выполнения могли использовать их в приложениях Магазин Windows. Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// 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" );
}
  

Эквивалент в .NET Framework

См. также

Ссылки

Потоковый ввод-вывод

freopen, _wfreopen

fclose, _fcloseall

_fdopen, _wfdopen

_fileno

fopen, _wfopen

_open, _wopen

_setmode