_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
會設為下列值之一。
errno 值 |
Condition |
---|---|
EACCES |
嘗試開啟唯讀檔案進行寫入,檔案的共用模式不允許指定的作業,或指定的路徑是目錄。 |
EEXIST |
指定了 _O_CREAT 和 _O_EXCL 旗標,但 filename 已存在。 |
EINVAL |
無效的 oflag 或 pmode 引數。 |
EMFILE |
沒有更多檔案描述項可用 (開啟了太多檔案)。 |
ENOENT |
找不到檔案或路徑。 |
如需這些傳回碼和其他傳回碼的詳細資訊,請參閱errno
、 _sys_errlist
_doserrno
和 _sys_nerr
。
備註
_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_WRONLY 指定 _O_RDWR 。 |
_O_RDWR |
開啟檔案以進行讀取和寫入。 無法使用 或 _O_WRONLY 指定 _O_RDONLY 。 |
_O_SEQUENTIAL |
指定針對但不限於磁碟的循序存取進行快取最佳化。 |
_O_TEXT |
以 ANSI 文字 (翻譯) 模式開啟檔案。 (如需詳細資訊,請參閱 文字和二進位模式檔案 I/O 和 fopen 。) |
_O_TRUNC |
開啟檔案,並將檔案截斷為零長度;檔案必須具有寫入權限。 無法使用 指定 。 _O_RDONLY _O_TRUNC 用於搭配 _O_CREAT 以開啟現有檔案或建立檔案。 注意: 旗標會 _O_TRUNC 終結指定檔案的內容。 |
_O_WRONLY |
將檔案開啟為僅供寫入。 無法使用 或 _O_RDWR 指定 _O_RDONLY 。 |
_O_U16TEXT |
以 Unicode UTF-16 模式開啟檔案。 |
_O_U8TEXT |
以 Unicode UTF-8 模式開啟檔案。 |
_O_WTEXT |
以 Unicode 模式開啟檔案。 |
若要指定檔案存取模式,您必須指定 _O_RDONLY
、_O_RDWR
或 _O_WRONLY
。 存取模式沒有預設值。
若使用 _O_WTEXT
開啟檔案以供讀取,_open
會讀取檔案開頭,並檢查位元順序標記 (BOM)。 如果有 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
以 Unicode 模式開啟檔案時,請輸入函式,將從檔案讀取的資料,轉譯為儲存為類型 wchar_t
的 UTF-16 資料。 寫入檔案的函式會以 Unicode 模式開啟,但包含儲存為類型 wchar_t
之 UTF-16 資料的緩衝區除外。 如果檔案編碼為UTF-8,則寫入UTF-8時,UTF-16數據會轉譯為UTF-8。 檔案的UTF-8編碼內容會在讀取時轉譯為UTF-16。 嘗試以 Unicode 模式讀取或寫入奇數位元組會導致 參數驗證 錯誤。 若要讀取或寫入作為 UTF-8 儲存在您程式裡的資料時,請使用文字或二進位檔案模式,不要使用 Unicode 模式。 您必須負責任何必要的編碼轉譯。
若搭配 _open
(附加模式) 及 _O_WRONLY | _O_APPEND
、_O_WTEXT
或 _O_U16TEXT
呼叫 _O_U8TEXT
,會先嘗試開啟檔案以供讀取和寫入,再讀取 BOM,然後重新開啟檔案且僅供寫入。 若開啟檔案以供讀取和寫入失敗,則會僅針對寫入開啟檔案,並使用 Unicode 模式設定的預設值。
當使用兩個以上的資訊清單常數形成 oflag
引數時,會使用位元 OR 運算子 (|
) 聯結常數。 如需二進位和文字模式的討論,請參閱 文字和二進位模式檔案 I/O。
指定 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
以外的值,即使它會在另一個操作系統中指定有效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
是 Microsoft 擴充功能。 如需相容性詳細資訊,請參閱相容性。
程式庫
所有版本的 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
另請參閱
低階 I/O
_chmod
, _wchmod
_close
_creat
, _wcreat
_dup
, _dup2
fopen
, _wfopen
_sopen
, _wsopen