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


_open, _wopen

Открывает файл. Эти функции признаны нерекомендуемыми, так как доступны более надежные и безопасные версии. См. раздел _sopen_s, _wsopen_s.

int _open(    const char *filename,    int oflag [,    int pmode]  ); int _wopen(    const wchar_t *filename,    int oflag [,    int pmode]  );

Параметры

  • filename
    Имя файла.

  • oflag
    Разрешенные типы операций.

  • pmode
    Режим разрешений.

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

Каждая из этих функций возвращает дескриптор файла для открытого файла. Возвращаемое значение -1 указывает на ошибку; в этом случае для errno задается одно из следующих значений.

  • EACCES
    Попытка открыть для записи файл, доступный только для чтения; запрет указанных операций режимом общего доступа к файлу или "данный путь является каталогом".

  • EEXIST
    Указаны флаги _O_CREAT и _O_EXCL, однако filename уже существует.

  • EINVAL
    Недопустимый аргумент oflag или pmode.

  • EMFILE
    Больше нет доступных дескрипторов файлов (открыто слишком много файлов).

  • ENOENT
    Файл или путь не найден.

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

Заметки

Функция _open открывает файл, указанный параметром filename, и готовит его к чтению или записи, как задано параметром oflag. _wopen — это версия _open с расширенными символами; аргумент filename для _wopen — строка расширенных символов. Поведение _wopen и _open идентично в противном случае.

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

Процедура Tchar.h

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

_MBCS определено

_UNICODE определено

_topen

_open

_open

_wopen

oflag является целочисленным выражением, сформированным из одной или нескольких следующих констант манифеста или их сочетаний, которые определяются в <fcntl.h>.

  • _O_APPEND
    Перемещает указатель файла в конец файла перед каждой операцией записи.

  • _O_BINARY
    Открывает файл в двоичном режиме (без преобразования). (Описание двоичного режима см. в разделе fopen.)

  • _O_CREAT
    Создает файл и открывает его для записи. Не действует, если существует файл, указанный параметром filename. Аргумент pmode обязателен, если указан флаг _O_CREAT.

  • _O_CREAT | _O_SHORT_LIVED
    Создает файл в качестве временного файла и, по возможности, не сбрасывает его на диск. Аргумент pmode обязателен, если указан флаг _O_CREAT.

  • _O_CREAT | _O_TEMPORARY
    Создает файл в качестве временного файла; файл удаляется при закрытии последнего дескриптора файла. Аргумент pmode обязателен, если указан флаг _O_CREAT.

  • _O_CREAT | _O_EXCL
    Возвращает значение ошибки, если файл, указанный параметром filename, существует. Применяется только при использовании с _O_CREAT.

  • _O_NOINHERIT
    Предотвращает создание общего дескриптора файла.

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

  • _O_RDONLY
    Открывает файл только для чтения. Нельзя указывать с _O_RDWR или _O_WRONLY.

  • _O_RDWR
    Открывает файл для чтения и записи. Нельзя указывать с _O_RDONLY или _O_WRONLY.

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

  • _O_TEXT
    Открывает файл в текстовом режиме (с преобразованием). (Дополнительные сведения см. в разделах Ввод и вывод файлов в текстовом и двоичном режиме и fopen.)

  • _O_TRUNC
    Открывает файл и обрезает его до нулевой длины; необходимо разрешение на запись в файл. Нельзя указывать с _O_RDONLY. _O_TRUNC при использовании с _O_CREAT открывает существующий файл или создает новый.

    Примечание

    Флаг _O_TRUNC удаляет содержимое указанного файла.

  • _O_WRONLY
    Открывает файл только для записи. Нельзя указывать с _O_RDONLY или _O_RDWR.

  • _O_U16TEXT
    Открывает файл в режиме Юникода UTF-16.

  • _O_U8TEXT
    Открывает файл в режиме Юникода UTF-8.

  • _O_WTEXT
    Открывает файл в режиме Юникода.

Чтобы указать режим доступа к файлу, необходимо задать _O_RDONLY, _O_RDWR или _O_WRONLY. Для режима доступа нет значения по умолчанию.

Если для открытия файла для чтения используется флаг _O_WTEXT, _open считывает начало файла и проверяет наличие метки порядка байтов (BOM). Если метка есть, файл обрабатывается как UTF-8 или UTF-16LE, в зависимости от значения метки. Если метка порядка байтов есть, файл обрабатывается как ANSI. Если файл открыт для записи с помощью флага _O_WTEXT, используется кодировка UTF-16. Независимо от любых предыдущих параметров или метки порядка байтов, если используется флаг _O_U8TEXT, файл всегда открывается в кодировке UTF-8; если используется флаг _O_U16TEXT, файл всегда открывается в кодировке UTF-16.

Если файл открывается в режиме Юникода с помощью флагов _O_WTEXT, _O_U8TEXT или _O_U16TEXT, функции ввода преобразуют данные, считываемые из файла в данные UTF-16, хранимые с типом wchar_t. Затем функции, которые выполняют запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие данные UTF-16, хранимые с типом wchar_t. Если кодировка файла — UTF-8, при его записи данные UTF-16 преобразуются в UTF-8, а содержимое файла с кодировкой UTF-8 преобразуется в данные UTF-16 при его считывании. Попытка чтения или записи нечетного числа байт в режиме Юникода приводит к возникновению ошибки проверки параметра. Для чтения или записи данных, хранимых в программе в кодировке UTF-8, используйте режим текстового или двоичного файла вместо режима Юникода. Вам необходимо реализовать все обязательные преобразования кодировки.

Если _open вызывается с флагами _O_WRONLY|_O_APPEND (режим добавления) и _O_WTEXT, _O_U16TEXT или _O_U8TEXT, сначала выполняется попытка открыть файл для чтения и записи, считывается метка порядка байтов, а затем файл снова открывается только для записи. Если происходит сбой открытия файла для чтения и записи, файл открывается только для записи и для параметра режима Юникода используется значение по умолчанию.

Если несколько констант манифеста используются для формирования аргумента oflag, константы объединяются с помощью битового оператора ИЛИ ( |). Сведения о двоичном и текстовом режиме см. в разделе Ввод и вывод файлов в текстовом и двоичном режиме.

Аргумент pmode обязателен, только если указан флаг _O_CREAT. Если файл уже существует, pmode игнорируется. В противном случае аргумент pmode задает параметры разрешений файла, которые настраиваются при первом закрытии нового файла. _open применяет текущую маску разрешений файла к pmode до настройки разрешений. (Дополнительные сведения см. в разделе _umask.) pmode — это целочисленное выражение, которое содержит одну или более следующих констант манифеста, определяемых в <sys\stat.h>.

  • _S_IREAD
    Разрешено только чтение.

  • _S_IWRITE
    Разрешена запись. (Если действует, разрешает чтение и запись.)

  • _S_IREAD | _S_IWRITE
    Разрешены чтение и запись.

Если заданы обе константы, они соединяются с помощью битового оператора ИЛИ ( |). В Windows все файлы доступны для чтения; разрешение только на запись недоступно. Поэтому режимы _S_IWRITE и _S_IREAD  | _S_IWRITE эквивалентны.

Если для аргумента pmode указано значение, отличающееся от некоего сочетания _S_IREAD и _S_IWRITE (даже если оно задает допустимое значение pmode в другой операционной системе), или если указано любое значение, кроме разрешенных значений oflag, функция создает утверждение в режиме отладки и вызывает обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если выполнение может быть продолжено, функция возвращает -1 и устанавливает errno в значение EINVAL.

Требования

Подпрограмма

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

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

_open

<io.h>

<fcntl.h>, <sys\types.h>, <sys\stat.h>

_wopen

<io.h> или <wchar.h>

<fcntl.h>, <sys\types.h>, <sys\stat.h>

_open и _wopen являются расширениями Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки

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

Пример

// crt_open.c
// compile with: /W3
/* This program uses _open to open a file
 * named CRT_OPEN.C for input and a file named CRT_OPEN.OUT
 * for output. The files are then closed.
 */
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>

int main( void )
{
   int fh1, fh2;

   fh1 = _open( "CRT_OPEN.C", _O_RDONLY ); // C4996
   // Note: _open is deprecated; consider using _sopen_s instead
   if( fh1 == -1 )
      perror( "Open failed on input file" );
   else
   {
      printf( "Open succeeded on input file\n" );
      _close( fh1 );
   }

   fh2 = _open( "CRT_OPEN.OUT", _O_WRONLY | _O_CREAT, _S_IREAD | 
                            _S_IWRITE ); // C4996
   if( fh2 == -1 )
      perror( "Open failed on output file" );
   else
   {
      printf( "Open succeeded on output file\n" );
      _close( fh2 );
   }
}

Вывод

Open succeeded on input file
Open succeeded on output file

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

См. также

Ссылки

Низкоуровневый ввод-вывод

_chmod, _wchmod

_close

_creat, _wcreat

_dup, _dup2

fopen, _wfopen

_sopen, _wsopen