名稱空間
變體
操作

std::FILE

來自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定義於標頭檔案 <cstdio>
typedef /* unspecified */ FILE;

每個 std::FILE 物件表示一個 C 流。

C 標準(C++ 標準引用)沒有指定 std::FILE 是否是完整的物件型別。雖然可以複製有效的 std::FILE,但將指向此類副本的指標作為 I/O 函式的引數會呼叫未指定的行為。換句話說,std::FILE 在語義上可能不可複製。

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

目錄

[編輯] 流狀態

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

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

[編輯] 窄和寬定向

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

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

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

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

從文字流讀取的資料只有在以下所有條件都為真時,才保證與之前寫入該流的資料相等:

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

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

[編輯] 注意

POSIX 明確要求當流的方向變為寬時,當前安裝的 C 區域設定的 LC_CTYPE 方面必須儲存在 FILE 物件中;POSIX 要求此 LC_CTYPE 方面用於此流上的所有未來 I/O,直到方向改變,無論之後是否呼叫 std::setlocale

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

[編輯] 另請參閱

抽象原始裝置
(類模板) [編輯]
實現原始檔案裝置
(類模板) [編輯]
與輸入流關聯的 FILE* 型別的表示式
與輸出流關聯的 FILE* 型別的表示式
與錯誤輸出流關聯的 FILE* 型別的表示式
(宏常量) [編輯]
C 文件 用於 FILE