fopen _wfopen

開啟檔案。 更多這些函式的可用安全版本,請參閱 fopen_s _wfopen_s

FILE *fopen( 
   const char *filename,
   const char *mode 
);
FILE *_wfopen( 
   const wchar_t *filename,
   const wchar_t *mode 
);

參數

  • filename
    檔案名稱

  • mode
    是允許的型別存取。

傳回值

這些函式都會傳回指標以開啟檔案。 null 指標值指示錯誤。 如果 filename 或 mode 是 NULL 或空字串,這些函式觸發無效的參數處理常式,在 參數驗證中說明。 如果執行允許繼續執行,這些函式傳回 NULL 並將 errno 設為 EINVAL。

如需詳細資訊,請參閱errno、 _doserrno、 _sys_errlist 和 _sys_nerr

備註

fopen 函式會開啟由 filename指定的檔案。 _wfopen 是 fopen的寬字元版本;對 _wfopen 的引數是寬字元字串。 否則, _wfopen 和 fopen 相同的行為。 使用 _wfopen 對用於檔案資料流的編碼字元集的作用。

表示fopen 接受表示在檔案系統中執行的路徑;表示 fopen 接受包含對應的網路磁碟機的 UNC 路徑和路徑,只要執行的系統程式碼參考這個共用的存取或對應的磁碟機上執行時。 當您建構 fopen的路徑時,請確定磁碟、路徑或網路共用可以在執行環境。 您可以使用正斜線 (/) 或反斜線 (\) 做為目錄分隔符號在路徑。

永遠檢查傳回值的指標是否是空的,在您對檔案之前的任何額外作業。 如果發生錯誤,這個全域變數 errno 設定可能使用取得特定的錯誤資訊。 如需詳細資訊,請參閱errno、 _doserrno、 _sys_errlist 和 _sys_nerr

Unicode 支援

fopen 支援 Unicode 檔案資料流。 若要開啟 Unicode 檔案,如下所示藉由指定預期編碼為 fopen,則 ccs 旗標。

fopen(&fp, "newfile.txt", "rw, ccs=encoding");

encoding 的允許值是 UNICODE、 UTF-8和 UTF-16LE。

如果檔案來讀取或附加已經存在並開啟,位元順序標記 (BOM),因此,如果在檔案中存在,決定編碼方式。 BOM 編碼的優先順序高於由 ccs 旗標指定的編碼方式。 只能使用 ccs 項目,當 BOM 不存在或是檔案是新的檔案。

注意事項注意事項

BOM 偵測只適用於即 Unicode 在模式下開啟的檔案 (傳遞 ccs 旗標)。

下表摘要說明可用於各種 ccs 旗標使用指定的 fopen 和位元組順序標記檔案的方式。

程式碼使用了以 ccs 旗標和 BOM

ccs 旗標

沒有 BOM (或新檔案)

BOM:UTF-8

BOM:UTF-16

UNICODE

UTF-16LE

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

為寫入的開啟檔案是以 Unicode 編碼方式的值會自動寫入的 BOM。

如果 mode 是「a, ccs=<encoding>」, fopen 會先嘗試開啟有兩個檔案讀取和寫入。 如果成功,這個函式讀取 BOM 判斷檔案的程式碼;如果失敗,函式用於檔案的預設編碼方式。 在任何情況下, fopen 會重新開啟具有唯寫存取檔案。 (這適用於 a 只方式,而不適用於 a+ 方法)。

泛用文字常式對應

TCHAR.H 常式

未定義 _UNICODE & _MBCS

已定義 _MBCS

已定義 _UNICODE

_tfopen

fopen

fopen

_wfopen

字串 mode 如下指定要求檔案,這個值的存取。

  • "r"
    開啟進行讀取、。 如果檔案不存在或找不到, fopen 呼叫失敗。

  • "w"
    開啟撰寫的空檔案。 如果指定的檔案存在,終結它的內容。

  • "a"
    撰寫會在檔案 (附加) 結束時,如果沒有移除檔案結尾 (EOF) 標記,在新的資料寫入檔案中。 如果不存在,則會建立檔案。

  • "r+"
    用於讀取和寫入開啟。 檔案必須存在。

  • "w+"
    開啟讀取和寫入的空檔案。 如果檔案存在,終結它的內容。

  • "a+"
    用於讀取和附加開啟。 在新的資料寫入檔案之前,附加的作業包括 EOF 符號的移除。 在寫入完成以後, EOF 標記沒有還原。 如果不存在,則會建立檔案。

您可以使用 "a" 存取型別或 "a+" 存取型別時,在檔案開啟,任何寫入作業可以發生在檔案結尾。 在任何寫入作業之前,使用 fseek 或 rewind,檔案指標可以重新調整位置,不過,一律會移回至檔案結尾。 因此,現有資料無法覆寫。

會附加到檔案之前, "a" 方法不會移除 EOF 標記。 在附加之後發生, MS-DOS 型別命令只會顯示資料由原始 EOF 標記決策和沒有任何資料附加至檔案。 在附加到檔案之前, "a+" 方法移除 EOF 標記。 在附加之後, MS-DOS 型別順序檔中的所有資料。 "a+" 方法對於附加所終止 CTRL+Z EOF 標記資料流檔案。

當 "r+"、 "w+"或 "a+" 存取型別指定時,讀取和寫入允許 (檔案被視為開啟為「Update」的按鈕)。 不過,也就是說,當您從讀取轉換為寫入時,輸入作業必須在 EOF 標記。 如果沒有 EOF,您必須使用介入呼叫到檔案當地語系化功能。 檔案當地語系化功能是 fsetpos、 fseek和 rewind。 當您從文字轉換為讀取時,您必須使用介入呼叫 fflush 或檔案當地語系化功能。

除了先前的值之外,下列字元可以附加到 mode 為新行字元指定版本模式。

  • t
    開啟文字 (轉換) 模式。 在此模式下, CTRL+Z 是解譯成輸入的 EOF 字元。 使用 "a+"的話,在為讀取/寫入開啟的檔案, fopen 檢查 CTRL+Z 在檔案結尾,並移除它。 這是可以做到的,因為使用 fseek 和 ftell 會 CTRL+Z 結束檔案內移動可能造成 fseek 在檔案結尾附近不完全一樣。

在文字模式,重設為一組組合轉譯成在輸入的單一新行字元,,和換行字元轉譯成輸出中重設換行字元的組合。 當 Unicode 資料流 I/O 函式在文字模式 (預設) 下運作,來源或目的資料流假設是多位元組字元序列。 因此, Unicode 資料流輸入函式轉換多位元組字元之寬字元 (就像由 mbtowc 函式的呼叫)。 基於相同的原因, Unicode 資料流輸出函式轉換寬字元對多位元組字元 (就像由 wctomb 函式的呼叫)。

  • b
    開啟二進位 (未轉譯的) 模式;包含歸位字元和換行字元的轉譯會隱藏。

如果 t 或 b 是 mode不會重新命名,版本模式的預設是由全域變數 _fmode定義的。 如果 t 或 b 前置引數,函式失敗並傳回 NULL。

如需如何使用文字和二進位模式的詳細資訊以 Unicode 和多位元組資料流 I/O,請參閱 文字和二進位模式下的檔案 I/O文字及二進位模式中的 Unicode 資料流 I/O

  • c
    啟用相關聯之 filename 的做旗標,以便檔案緩衝區的內容直接寫入磁碟,如果呼叫 fflush 或 _flushall 。

  • n
    重設相關聯之 filename 的做旗標「no-cache」做。這是預設值。 如果您使用 COMMODE.OBJ,連結您的程式也會覆寫全域做旗標。 全域做旗標預設值為「no-cache」做,除非您使用 COMMODE.OBJ 明確連結您的程式 (請參閱 連結選項)。

  • N
    指定檔案沒有由子處理序繼承。

  • S
    指定快取進行最佳化,不過,沒有限制,循序存取從磁碟。

  • R
    指定快取進行最佳化,不過,沒有限制,隨機存取從磁碟。

  • T
    指定檔案如暫存。 可能的話,不會清除至磁碟。

  • D
    指定檔案如暫存。 最後,當檔案指標關閉時,會刪除。

  • ccs=ENCODING
    指定編碼字元集對這個檔案使用 (UTF-8、 UTF-16LE或 UNICODE)。 如果您想要使用 ANSI 編碼方式,請保留未指定。

mode 的有效字元字串會使用 fopen ,而 _fdopen 如下對應於 oflag 引數使用 _open_sopen,。

在模式字串中的字元

_open的對等_sopen/ oflag 值

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

None

n

None

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORTLIVED

D

_O_TEMPORARY

ccs=UNICODE

_O_WTEXT

ccs=UTF-8

_O_UTF8

ccs=UTF-16LE

_O_UTF16

如果您使用 rb 模式,不需要移植程式碼,並預期讀大部分大型檔案或不擔心網路效能,您也可以考慮使用記憶體對應 Win32 檔案做為選項。

需求

Function

必要的標頭檔

fopen

<stdio.h>

_wfopen

<stdio.h> 或 <wchar.h>

如需相容性的詳細資訊,請參閱 相容性

c、 n、 t、 S、 R、 T和 Dmode 選項是 fopen 和 _fdopen 的 Microsoft 擴充功能,而且不應該使用 ANSI 可攜性所需的位置。

範例

下列程式開啟兩個檔案。 它會使用 fclose 關閉第一個檔案和 _fcloseall 關閉所有剩下的檔案。

// crt_fopen.c
// compile with: /W3
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write 
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

   // Close stream if it is not NULL 
   if( stream)
   {
      if ( fclose( stream ) )
      {
         printf( "The file 'crt_fopen.c' was not closed\n" );
      }
   }

   // All other files are closed: 
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
  

下列程式會建立一個檔案 (或覆寫的,如果存在),在具有 Unicode 的文字輸入模式。 它接著將兩個字串輸入檔案並關閉檔案。 輸出是名為的檔案 _wfopen_test.xml,包含從輸出區域的資料。

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.
 
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
wchar_t str[BUFFER_SIZE];
size_t  strSize;
FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!\n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!\n");
    }
    return 0;
}

.NET Framework 對等用法

請參閱

參考

資料流 I/O

多位元組字元序列的轉譯工作

fclose _fcloseall

_fdopen _wfdopen

ferror

_fileno

freopen _wfreopen

_open _wopen

_setmode

_sopen _wsopen