std::FILE
定義於標頭檔案 <cstdio> |
||
typedef /* unspecified */ FILE; |
||
每個 std::FILE
物件表示一個 C 流。
C 標準(C++ 標準引用)沒有指定 std::FILE
是否是完整的物件型別。雖然可以複製有效的 std::FILE
,但將指向此類副本的指標作為 I/O 函式的引數會呼叫未指定的行為。換句話說,std::FILE
在語義上可能不可複製。
I/O 流可用於非格式化和格式化輸入和輸出。此外,處理輸入和輸出的函式也可以是區域設定敏感的,以便在必要時執行寬/多位元組轉換。
目錄 |
[編輯] 流狀態
除了訪問裝置所需的系統特定資訊(例如,一個 POSIX 檔案描述符),每個 std::FILE
物件直接或間接持有以下內容
- 字元寬度:未設定、窄或寬。
- 多位元組和寬字元之間轉換的解析狀態(一個 std::mbstate_t 型別的物件)
- 緩衝狀態:無緩衝、行緩衝、全緩衝。
- 緩衝區,可以由外部使用者提供的緩衝區替換。
- I/O 模式:輸入、輸出或更新(輸入和輸出)。
- 二進位制/文字模式指示符。
- 檔案結束狀態指示符。
- 錯誤狀態指示符。
- 檔案位置指示符,可作為 std::fpos_t 型別的物件訪問,對於寬流,它包括解析狀態。
- (C++17) 用於在多個執行緒讀、寫、定位或查詢流位置時防止資料競爭的可重入鎖。
[編輯] 窄和寬定向
新開啟的流沒有方向。首次呼叫 std::fwide 或任何 I/O 函式會建立方向:寬 I/O 函式使流寬定向;窄 I/O 函式使流窄定向。一旦設定,方向只能透過 std::freopen 更改。窄 I/O 函式不能在寬定向流上呼叫;寬 I/O 函式不能在窄定向流上呼叫。寬 I/O 函式在寬字元和多位元組字元之間進行轉換,就像透過呼叫 std::mbrtowc 或 std::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
|