共用方式為


_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

請參閱

參考

資料流 I/O

_dup、_dup2

fclose、_fcloseall

fopen、_wfopen

freopen、_wfreopen

_open、_wopen