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


_open, _wopen

Открывает файл. Эти функции устарели, так как доступны более безопасные версии; see _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 задается одно из следующих значений.

Значение errno Condition
EACCES Попытка открыть файл только для чтения для записи, режим общего доступа к файлам не разрешает указанные операции, или заданный путь является каталогом.
EEXIST Указаны флаги _O_CREAT и _O_EXCL, однако filename уже существует.
EINVAL Недопустимый аргумент oflag или pmode.
EMFILE Больше нет доступных дескрипторов файлов (открыто слишком много файлов).
ENOENT Файл или путь не найден.

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

Замечания

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

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

<tchar.h> рутина _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_topen _open _open _wopen

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

константа oflag; Поведение
_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 Открывает файл в режиме перевода текста ANSI. (Дополнительные сведения см. в разделе Текстовый и двоичный режим операций ввода-вывода и 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). Если есть BOM, файл рассматривается как UTF-8 или UTF-16LE в зависимости от BOM. Если метка порядка байтов есть, файл обрабатывается как 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>.

pmode Значение
_S_IREAD Разрешено только чтение.
_S_IWRITE Разрешена запись. (Если действует, разрешает чтение и запись.)
_S_IREAD | _S_IWRITE Разрешены чтение и запись.

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

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

Требования

Function Обязательный заголовок Необязательный заголовок
_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

См. также

Низкоуровневый ввод-вывод
_chmod, _wchmod
_close
_creat, _wcreat
_dup, _dup2
fopen, _wfopen
_sopen, _wsopen