_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