_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 指標)。
如需這些錯誤碼和其他錯誤碼的詳細資訊,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
備註
_fdopen
函式會將 I/O 資料流與 fd
所識別的檔案產生關聯,因此允許針對低層級 I/O 開啟的檔案經過緩衝處理和格式化。 _wfdopen
是寬字元版本的 _fdopen
; mode
的 _wfdopen
引數是寬字元字串。 除此之外,_wfdopen
和 _fdopen
的行為相同。
傳入的 _fdopen
檔案描述項是由傳 FILE *
回的數據流所擁有。 如果 _fdopen
成功,請勿在檔案描述元上呼叫 _close
。 在傳FILE *
回的上呼叫 fclose
也會關閉檔案描述元。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更它,請參閱 CRT中的全域狀態。
mode
字元字串會指定針對檔案要求的檔案存取類型:
mode |
存取 |
---|---|
"r" |
開啟以讀取。 如果檔案不存在或找不到,呼叫 fopen 就會失敗。 |
"w" |
開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。 |
"a" |
開啟以在檔案結尾寫入 (附加)。 如果該檔案不存在,則建立檔案。 |
"r+" |
開啟以進行讀取和寫入。 檔案必須存在。 |
"w+" |
開啟空白檔案以進行讀取和寫入。 如果檔案存在,其內容會遭到銷毀。 |
"a+" |
開啟以進行讀取和附加。 如果該檔案不存在,則建立檔案。 |
使用 "a"
或 "a+"
存取類型開啟檔案時,所有寫入作業都會在檔案結尾進行。 檔案指標可以使用 或 rewind
來重新置放fseek
,但在執行任何寫入作業之前,一律會移回檔案的結尾。因此,無法覆寫現有的數據。 指定 "r+"
、"w+"
或 "a+"
存取類型時,同時允許讀取和寫入 (表示檔案是要開啟以供「更新」之用)。 不過,當您在讀取和寫入之間切換時,必須有中間的 fflush
、fsetpos
、fseek
或 rewind
作業。 您可以視需要指定 fsetpos
或 fseek
作業的目前位置。
除了上述值之外,也可以包含 mode
下列字元,以指定換行符的翻譯模式:
mode 修飾元 |
行為 |
---|---|
t |
以文字 (已轉譯) 模式開啟。 在此模式中,會將歸位字元-換行字元 (CR-LF) 組合在輸入中轉譯成單行換行字元 (LF),且會將 LF 字元在輸出中轉譯為 CR-LF 組合。 此外,Ctrl+Z 會在輸入中解譯成檔案結尾字元。 |
b |
以二進位 (未轉譯) 模式開啟。 會隱藏任何來自 t 模式的轉譯。 |
c |
啟用關聯 filename 的認可旗標,以便在呼叫 fflush 或 _flushall 時,將檔案緩衝區的內容直接寫入磁碟。 |
n |
將關聯的 filename 認可旗標重設為 「無認可」。此旗標是預設值。 如果您將程序連結至 Commode.obj ,它也會覆寫全域認可旗標。 除非您明確地將程序連結至 Commode.obj ,否則全域認可旗標預設值為「無認可」。 |
t
、 c
和 n
mode
選項Microsoft 和 _fdopen
的fopen
延伸模組。 如果您想要保留 ANSI 可移植性,請勿使用它們。
如果 t
或 b
未在 中 mode
指定 ,則預設轉譯模式是由全域變數 _fmode
所定義。 如果引數前置 t
或 b
,則函式失敗並傳回 NULL
。 如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O。
和中使用的_fdopen
fopen
字串的有效字元mode
會對應至 oflag
和 _sopen
中使用的_open
自變數,如下表所示:
mode 字串中的字元 |
和的_open 對等oflag 值_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 |
無 |
需求
函式 | 必要的標頭 | C++ 標頭 |
---|---|---|
_fdopen |
<stdio.h> |
<cstdio> |
_wfdopen |
<stdio.h> 或 <wchar.h> |
<cstdio> |
如需 C 運行時間連結庫中標準一致性和命名慣例的詳細資訊,請參閱 相容性。
一般文字常式對應
<tchar.h> 常式 |
_UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tfdopen |
_fdopen |
_fdopen |
_wfdopen |
範例
// 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 );
}
輸入:crt_fdopen.txt
Line one
Line two
輸出
Lines in file: 2
另請參閱
資料流 I/O
_dup
, _dup2
fclose
, _fcloseall
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen