_fdopen、_wfdopen
關聯資料流與用於低階 I/O 先前開啟的檔案。
FILE *_fdopen(
int fd,
const char *mode
);
FILE *_wfdopen(
int fd,
const wchar_t *mode
);
參數
fd
開啟檔案的檔案描述。mode
檔案存取的類型
傳回值
每一個這些函式都會傳回已開啟資料流的指標。 null 指標值表示錯誤。 每當錯誤發生, 則會叫用無效參數處理常式,如參數驗證中所述。 如果執行允許繼續, errno 會設定的任一對 EBADF,指出錯誤的檔案描述項,則為 EINVAL,表示 mode 是 null 指標。
如需有關這些錯誤碼和其他錯誤碼的詳細資訊,請參閱 _doserrno、errno、_sys_errlist 和 _sys_nerr。
備註
_fdopen 函式關聯具有由 fd 識別的檔案的 I/O 資料流,因此允許為低階 I/O 開啟的檔案被緩衝及格式化。 _wfdopen 是 _fdopen 的寬字元版本。 _wfdopen 的 mode 引數是寬字元字串。 _wfdopen 和 _fdopen 其餘行為相同。
一般文字常式對應
Tchar.h 常式 |
未定義 _UNICODE and _MBCS |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tfdopen |
_fdopen |
_fdopen |
_wfdopen |
mode 字元字串指定檔案和檔案存取類型。
字元字串 mode 會指定對檔案要求的存取型別,如下表所示。
"r"
開啟以讀取。 如果檔案不存在或找不到,fopen 呼叫就會失敗。"w"
開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。"a"
為寫入開啟,檔案 (附加) 結尾。 如果檔案不存在時,建立檔案。"r+"
開啟以進行讀取和寫入。(檔案必須存在。)"w+"
開啟空白檔案以進行讀取和寫入。 如果指定的檔案已存在,其內容將被終結。"a+"
開啟以進行讀取和附加。 如果檔案不存在時,建立檔案。
當檔案與 "a" 或 "a+" 存取型別一起開啟檔案時,所有寫入作業都會在檔案結尾進行。 檔案指標可以使用 fseek 或 rewind 重新調整位置,但是在執行任何寫入作業之前,永遠會移回至檔案結尾。 因此,無法覆寫現有資料。 指定 "r+"、"w+" 或 "a+" 存取類型時,同時允許讀取和寫入 (表示檔案是要開啟以供「更新」之用)。 然而,在您在讀取和寫入之間,必須有介入的 fflush、 fsetpos、 fseek 或 rewind 作業。 如果需要,您可以為 fsetpos 或 fseek 作業指定目前位置。
除了上述的值之外,還可以將下列字元包含進 mode 指定新行字元的轉譯模式。
t
以文字 (已轉譯) 模式開啟。 在這個模式下,傳回-line feed (CR-LF) 組合的歸位字元會在輸入時轉換成單行換行字元,而 LF 字元會在輸出時轉換成 CR-LF 組合。 此外,Ctrl+Z 將解譯成輸入的檔案結尾字元。 在開啟檔案讀去/寫入中,fopen檢查檔案結尾是否有 Ctrl+Z,並加以移除(如果可能)。 之所以這樣做,是因為使用 fseek 和 ftell 函式在以 CTRL+Z 結束的檔案內移動可能會讓 fseek 在檔案結尾附近產生不正確的行為。b
開啟二進位 (未轉譯的) 模式。 從 t 模式的轉譯會隱藏。c
啟用關聯 filename 的認可旗標,以便在呼叫 fflush 或 _flushall 時,將檔案緩衝區的內容直接寫入磁碟。n
將關聯 filename 的認可旗標重設為 "no-commit"。這是預設值。 如果將程式與 Commode.obj 連結,也會覆寫全域認可旗標。 除非您明確將程式與 Commode.obj 連結,全域認可旗標預設值為 "no-commit"。
t、 c和 n mode 選項是 fopen 和 _fdopen的 Microsoft 擴充功能。 如果要保存 ANSI 可攜性,不要使用。
如果 mode 中未指定 t 或 b,則預設轉譯模式由全域變數 _fmode 定義。 如果引數前置 t 或 b,則函式失敗並傳回 NULL。 如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O。
fopen 和 _fdopen 中所用 mode 字串的有效字元會對應用於 _open 和 _sopen 的 oflag 引數,如下所示。
mode 字串中的字元 |
相等的 oflag 對於 _open/_sopen 的 值 |
---|---|
a |
_O_WRONLY | _O_APPEND (通常為 _O_WRONLY | _O_CREAT | _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 |
無 |
n |
無 |
需求
功能 |
必要的標頭 |
---|---|
_fdopen |
<stdio.h> |
_wfdopen |
<stdio.h> 或 <wchar.h> |
如需詳細的相容性資訊,請參閱相容性。
範例
// crt_fdopen.c
// This program opens a file by using low-level
// I/O, then uses _fdopen to switch to stream
// access. It counts the lines in the file.
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>
int main( void )
{
FILE *stream;
int fd, count = 0;
char inbuf[128];
// Open a file.
if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )
exit( 1 );
// Get stream from file descriptor.
if( (stream = _fdopen( fd, "r" )) == NULL )
exit( 1 );
while( fgets( inbuf, 128, stream ) != NULL )
count++;
// After _fdopen, close by using fclose, not _close.
fclose( stream );
printf( "Lines in file: %d\n", count );
}
Input: crt_fdopen.txt
Line one
Line two
Output
Lines in file: 2
.NET Framework 對等用法
System::IO::FileStream::FileStream