Share via


_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 是寬字元版本的 _fdopenmode_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+" 存取類型時,同時允許讀取和寫入 (表示檔案是要開啟以供「更新」之用)。 不過,當您在讀取和寫入之間切換時,必須有中間的 fflushfsetposfseekrewind 作業。 您可以視需要指定 fsetposfseek 作業的目前位置。

除了上述值之外,也可以包含 mode 下列字元,以指定分行符號的翻譯模式:

mode 改 性 劑 行為
t 以文字 (已轉譯) 模式開啟。 在此模式中,會將歸位字元-換行字元 (CR-LF) 組合在輸入中轉譯成單行換行字元 (LF),且會將 LF 字元在輸出中轉譯為 CR-LF 組合。 此外,Ctrl+Z 會在輸入中解譯成檔案結尾字元。
b 以二進位 (未轉譯) 模式開啟。 會隱藏任何來自 t 模式的轉譯。
c 啟用關聯 filename 的認可旗標,以便在呼叫 fflush_flushall 時,將檔案緩衝區的內容直接寫入磁碟。
n 將關聯的 filename 認可旗標重設為 「無認可」。此旗標是預設值。 如果您將程式連結至 Commode.obj ,它也會覆寫全域認可旗標。 除非您明確地將程式連結至 Commode.obj ,否則全域認可旗標預設值為「無認可」。

tcnmode 選項是 fopen_fdopen 的 Microsoft 延伸模組。 如果您想要保留 ANSI 可攜性,請勿使用它們。

如果 tb 未在 中 mode 指定 ,則預設轉譯模式是由全域變數 _fmode 所定義。 如果引數前置 tb ,則函式失敗並傳回 NULL。 如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O

和 中使用的 _fdopenfopen 字串的有效字元 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