fopen_s, _wfopen_s

Файл будет открыт.Эти версии fopen, _wfopen имеют расширения безопасности, как описано в разделе Средства безопасности в CRT.

errno_t fopen_s( 
   FILE** pFile,
   const char *filename,
   const char *mode 
);
errno_t _wfopen_s(
   FILE** pFile,
   const wchar_t *filename,
   const wchar_t *mode 
);

Параметры

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

  • [входящий] filename
    Имя файла.

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

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

Нуль, если успешно; код ошибки при неудаче.Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlist и _sys_nerr об этих кодах ошибок.

Условия возникновения ошибки

pFile

filename

mode

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

Содержимое pFile

NULL

любое значение

любое значение

EINVAL

unchanged

любое значение

NULL

любое значение

EINVAL

unchanged

любое значение

любое значение

NULL

EINVAL

unchanged

Заметки

Файлы, fopen_s и _wfopen_s не sharable.Если требуется, чтобы файл sharable, используя _fsopen, _wfsopen с соответствующими файловом режимом константа- для примера, _SH_DENYNO для чтения или записи совместного использования.

Функция fopen_s будет открыт файл, который задается параметром filename.версия _wfopen_s является fopen_s; аргументы для _wfopen_s характерные черты.В остальных случаях поведение _wfopen_s и fopen_s идентично.

fopen_s принимает пути, допустимые в файловой системе быть точки при выполнения; Расположении и пути, содержащие подключенные сетевые диски fopen_s предполагается, что система, которая выполняет код имеет доступ к общей папке или сопоставленный сетевой диск во время выполнения.При построении пути для fopen_s, не делать предположения о доступности дисков, путей или сетевых папок среды выполнения.Можно использовать или символы обратной косой черты (/) или символы обратной косой черты (\) в качестве разделителей каталога в пути.

Эти функции проверяют их параметрами.Если pFile, filename или mode указатель, эти функции создают исключение недопустимого параметра, как описано в разделе Проверка параметров.

Всегда проверяйте возвращаемое значение, чтобы определить, функция выполнена успешно, то перед запуском все дальнейшее операции в файле.При возникновении ошибки, возвращен код ошибки и глобальная переменная errno задания.Для получения дополнительной информации см. errno, _doserrno, _sys_errlist и _sys_nerr.

Поддержка юникода

fopen_s поддерживает файловых потоков юникода.Для открытия нового или существующего файла юникода передайте флажок ccs, который определяет кодирование новое значение fopen_s.

fopen_s(&fp, "newfile.txt", "rw, ccs=encoding");

Допустимые значения: encoding, UTF-8, UNICODE и UTF-16LE.При наличии не задан для encoding, fopen_s использует кодирование ANSI.

Если файл уже существует и открыт для чтения или добавить, метки порядка байтов (BOM), при наличии его в файле, задает кодирование.Кодирование спецификации имеет приоритет перед кодированием, определенное флажком ccs.Кодирование ccs используется, если только не спецификация отсутствует или если файл новый файл.

ПримечаниеПримечание

Спецификация- обнаружение применяется только к файлам, которые будут открываться юникода; то есть путем передачи флажок ccs.

В следующей таблице приведены режимы для различных флажков ccs, данные в fopen_s для метки порядка байтов в файле.

Кодирования используется на основе флажке и спецификации ccs

Флаг ccs

Нет спецификации (или нового файла)

Спецификация: UTF-8

Спецификация: UTF-16

UNICODE

UTF-16LE

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

Файлы, открыт для записи в режиме юникода имеет спецификацию XML на них автоматически.

Если mode "a, ccs=<encoding>", то fopen_s сначала пытается открыть файл с доступом на чтение, и с записью.В случае успеха функция считывает спецификацию для определения кода для файла; если операция завершилась неудачей, функция использует кодирование по умолчанию для файлов.В любом случае, fopen_s затем снова откроет файл доступен только с доступом на запись.(Это применяется к только режим a, а не как a+).

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

Функция TCHAR.H

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

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

Определение _UNICODE

_tfopen_s

fopen_s

fopen_s

_wfopen_s

Символьная строка mode указывает тип доступа, который запрошен для файла следующим образом.

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

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

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

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

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

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

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

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

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

Помимо вышеуказанным значений, следующие символы можно включить в mode, чтобы указать режим для перевода символов новой строки:

  • t
    Открыть в режиме (переведенного текста).В этом режиме CTRL+Z, интерпретируется как символ элемент - файла на входе.В файлах открытых для чтения/записи с "a+", fopen_s проверяет наличие CTRL+Z в конце файла и удаляет его, если это возможно.Это сделано потому, что использование fseek и ftell для перемещения в файле, который заканчивается CTRL+Z, может вызвать fseek работать неправильно ближе к концу файла.

Кроме того, в режиме текста, сочетания RETURN- перевода строки экипажа переведены в одиночные переводы строк на входе и символы перевода строки изменены на сочетаниями RETURN- перевода строки экипажа на выходе.Если функция юникода stream-I/O работает в режиме текста (по умолчанию), источник или предполагается, что будет поток назначения последовательностью многобайтовых символов.Поэтому функции потока входных данных преобразования юникода символы многобайтовой к расширенным символы (если при вызове функции mbtowc ).По этой же причине функции потока вывода преобразование расширенных символов юникода на символы многобайтовой (если при вызове функции wctomb ).

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

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

Дополнительные сведения об использовании режимов текста и бинарный в юникоде и многобайтовой stream-I/O см. в разделах Вводом-выводом режима текста и бинарный и Потока ВВОДА-ВЫВОДА юникода в режимах текста и бинарный.

  • c
    Включите флажок фиксации для связанного объекта filename, чтобы содержимое файлового буфера будут записываются непосредственно на диск, если fflush или _flushall вызываются.

  • n
    Сбросьте флажок фиксации для связанного объекта filename "," фиксации. Задано по умолчанию.Она также переопределяет глобальный флажок фиксации при соединении программы с COMMODE.OBJ.Глобальное значение по умолчанию флажка фиксации ", фиксация", если явно не рассматривается связывание программы с COMMODE.OBJ (см. Параметры соединения).

  • N
    Указывает, что файл не наследуется дочерними процессами.

  • S
    Указывает, что помещающ кэширование оптимизирует, но не для ограничения, последовательный с диска.

  • R
    Указывает, что помещающ кэширование оптимизирует, но не для ограничения, прямой доступ с диска.

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

  • D
    Определяет, как временный файл.Он удаляется, когда последний указатель файла закрыт.

  • ccs=ENCODING
    Определите закодированную кодировки для использования (UTF-8, UTF-16LE и ЮНИКОДА) для этого файла.Оставьте данное unspecified, если требуется кодирование ANSI.

Допустимые символы для строки mode, используемой в fopen_s и _fdopen соответствуют аргументам oflag, используемым в _open и _sopen следующим образом.

Символы в строке режима

Эквивалентно oflag значение _open или _sopen

a

обычно _O_WRONLY | _O_CREAT |_O_WRONLY | _O_APPEND (_O_APPEND)

a+

_O_RDWR | _O_APPEND (обычно это _O_RDWR | _O_APPEND | _O_CREAT )

r

_O_RDONLY

r+

_O_RDWR

w

обычно _O_WRONLY |_O_WRONLY (_O_CREAT | _O_TRUNC)

w+

_O_RDWR (обычно это _O_RDWR | _O_CREAT | _O_TRUNC)

b

_O_BINARY

t

_O_TEXT

c

None

n

None

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORTLIVED

D

_O_TEMPORARY

ccs=UNICODE

_O_WTEXT

ccs=UTF-8

_O_UTF8

ccs=UTF-16LE

_O_UTF16

Если необходимо использовать режим rb, не понадобится порт код и пользоваться для чтения многих файл или не заботите о сетевой производительности, сопоставленных памятью файлов Win32 может также быть параметром.

Требования

Функция

Требуемый заголовок

fopen_s

<stdio.h>

_wfopen_s

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

Дополнительные сведения о совместимости см. в разделе Совместимость во введении.

Библиотеки

Все версии Библиотек времени выполнения C.

c, n и tmode расширения Майкрософт для fopen_s и _fdopen и не должны использоваться, переносимость ANSI пожелана.

Пример

// crt_fopen_s.c
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.
 

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   errno_t err;

   // Open for read (will fail if file "crt_fopen_s.c" does not exist)
   err  = fopen_s( &stream, "crt_fopen_s.c", "r" );
   if( err == 0 )
   {
      printf( "The file 'crt_fopen_s.c' was opened\n" );
   }
   else
   {
      printf( "The file 'crt_fopen_s.c' was not opened\n" );
   }

   // Open for write 
   err = fopen_s( &stream2, "data2", "w+" );
   if( err == 0 )
   {
      printf( "The file 'data2' was opened\n" );
   }
   else
   {
      printf( "The file 'data2' was not opened\n" );
   }

   // Close stream if it is not NULL 
   if( stream )
   {
      err = fclose( stream );
      if ( err == 0 )
      {
         printf( "The file 'crt_fopen_s.c' was closed\n" );
      }
      else
      {
         printf( "The file 'crt_fopen_s.c' was not closed\n" );
      }
   }

   // All other files are closed:
   int numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
  

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

См. также

Ссылки

Поток ВВОДА-ВЫВОДА

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode