名稱空間
變體
操作

檔案

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
檔案

函式
檔案訪問
(C95)
非格式化輸入/輸出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <stdio.h>
typedef /* 未指定 */ FILE;

每個 FILE 物件表示一個 C 語言流。

C 標準並未指定 FILE 是否為完整的物件型別。雖然可能複製一個有效的 FILE,但使用指向該副本的指標作為 I/O 函式的引數會呼叫未指定的行為。換句話說,FILE 在語義上可能是不可複製的。

I/O 流可用於非格式化和格式化輸入和輸出。此外,處理輸入和輸出的函式也可能對區域設定敏感,以便在必要時執行寬/多位元組轉換。

目錄

[編輯] 流狀態

除了訪問裝置所需的系統特定資訊(例如,POSIX 檔案描述符),每個 FILE 物件直接或間接包含以下內容:

  1. (C95) 字元寬度:未設定、窄或寬。
  2. (C95) 多位元組字元和寬字元之間轉換的解析狀態(型別為 mbstate_t 的物件)
  3. 緩衝狀態:無緩衝、行緩衝、完全緩衝。
  4. 緩衝區,可由外部使用者提供的緩衝區替換。
  5. I/O 模式:輸入、輸出或更新(輸入和輸出均可)。
  6. 二進位制/文字模式指示符。
  7. 檔案結束狀態指示符。
  8. 錯誤狀態指示符。
  9. 檔案位置指示符,可作為型別 fpos_t 的物件訪問,對於寬流,它包括解析狀態。
  10. (C11) 當多個執行緒讀取、寫入、定位或查詢流的位置時,用於防止資料競爭的可重入鎖。

[編輯] 窄向和寬向

新開啟的流沒有方向。第一次呼叫 fwide 或任何 I/O 函式都會建立方向:寬 I/O 函式使流寬向,窄 I/O 函式使流窄向。一旦設定,方向只能透過 freopen 更改。窄 I/O 函式不能在寬向流上呼叫;寬 I/O 函式不能在窄向流上呼叫。寬 I/O 函式在寬字元和多位元組字元之間進行轉換,如同透過呼叫 mbrtowcwcrtomb,並使用流描述的轉換狀態。與程式中有效的多位元組字元字串不同,檔案中的多位元組字元序列可能包含嵌入的空字元,並且不必以初始移位狀態開始或結束。

具有寬方向的流的轉換狀態由設定流方向時安裝的 C 區域設定確定。

[編輯] 二進位制和文字模式

文字流是可組成行的有序字元序列;一行可分解為零個或多個字元加上一個終止符 '\n' (“換行”) 字元。最後一行是否需要終止符 '\n' 是實現定義的。此外,為了符合 OS 中表示文字的約定,輸入和輸出時可能需要新增、更改或刪除字元(特別是,Windows OS 上的 C 流在輸出時將 '\n' 轉換為 '\r\n',在輸入時將 '\r\n' 轉換為 '\n')。

從文字流讀取的資料僅在以下各項都為真時,才保證與之前寫入該流的資料相等:

  • 資料僅包含可列印字元和/或控制字元 '\t''\n'(特別是,在 Windows OS 上,字元 '\0x1A' 會終止輸入)。
  • 沒有 '\n' 字元緊接在空格字元之後(這些空格字元在後續作為輸入讀取時可能會消失)。
  • 最後一個字元是 '\n'

二進位制流是一個有序字元序列,可以透明地記錄內部資料。從二進位制流讀取的資料總是等於之前寫入該流的資料,除了實現被允許在流的末尾追加不確定數量的空字元。寬二進位制流不需要以初始移位狀態結束。

[編輯] 備註

POSIX 明確要求,在流的方向變為寬向時,當前安裝的 C 區域設定的 LC_CTYPE 面儲存在 FILE 物件中;POSIX 要求,在方向改變之前,所有未來的 I/O 操作都使用這個 LC_CTYPE 面,而不管隨後對 setlocale 的任何呼叫。

文字的每一行旨在由本質上人類可讀的資料組成。POSIX 實現不區分文字流和二進位制流(對 '\n' 或任何其他字元沒有特殊對映)。

[編輯] 參考文獻

  • C17 標準 (ISO/IEC 9899:2018)
  • 7.21 輸入/輸出 <stdio.h> (p: 217-247)
  • 7.29 擴充套件多位元組和寬字元實用程式 <wchar.h> (p: 295-325)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.21 輸入/輸出 <stdio.h> (p: 296-339)
  • 7.29 擴充套件多位元組和寬字元工具 <wchar.h> (p: 402-446)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.19 輸入/輸出 <stdio.h> (p: 262-305)
  • 7.24 擴充套件多位元組和寬字元工具 <wchar.h> (p: 348-392)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.9 輸入/輸出 <stdio.h>

[編輯] 另請參見

與輸入流關聯的型別為 FILE* 的表示式
與輸出流關聯的型別為 FILE* 的表示式
與錯誤輸出流關聯的型別為 FILE* 的表示式
(宏常量) [編輯]
C++ 文件 for FILE