第8章 IO庫
8.1 IO 類
8.2 文件輸入輸出
8.3 string流
8.1 IO 類
- 寬字符版本的類型和函數的名字以一個w開始
- 標準庫使我們忽略這些不同類型的流之間的差異,這是通過
繼承機制
實現的。類型ifstream
和istringstream
都繼承自istream
- 不能拷貝或對IO對象賦值,進行IO操作的函數通常以引用方式傳遞和返回流。讀寫一個IO對象會改變其狀態,因此傳遞和返回的引用不能是const
條件狀態
可以幫助我們訪問和操縱流
-
查詢流的狀態.
-
管理流的狀態.
-
管理輸出緩衝.
每個輸出流都管理一個緩衝區,用來保持程序讀寫的數據,允許os將多個輸出操作組合爲單一的設備寫操作可以帶來很大的性能提升。導致緩衝刷新的原因有很多:
程序正常結束
緩衝區滿
操縱符endl
操縱符unitbuf設置流的內部狀態, 默認cerr是設置unitbuf
一個輸出流可能被關聯到另一個流,當讀寫被關聯的流是,關聯到的流的緩衝區會被刷新,默認cin和cerr都關聯到cout
-
刷新輸出緩衝區.
IO庫中還有兩個類似的操作符flush
和ends
。flush
刷新緩衝區,但不輸出任何額外的字符;ends
向緩衝區插入一個空字符,然後刷新緩衝區。
-
unitbuf操縱符.
在每次寫操作之後都進行一次flush操作。而nounitbuf
操縱符則重置流
-
如果程序崩潰,輸出緩衝區不會被刷新
-
關聯輸入和輸出流.
交互式系統通常應該關聯輸入流和輸出流。這意味着所有輸出,包括用戶提示信息,都會在讀操作之前被打印出來。 -
關聯符tie.
8.2 文件輸入輸出
-
頭文件
fstream
定義了三個類型來支持文件IO。ifstream
從一個給定文件讀取數據,ofstream
向一個給定文件寫入數據,以及fstream
可以讀寫給定文件
-
讀寫一個文件時,定義一個文件流對象,將文件流對象與文件關聯起來,每個文件流類都定義了一個名爲
open
的成員函數,完成一些系統相關的操作。如果提供文件名(可選),則open會自動被調用
-
用fstream代替iostream&.
在要求使用基類型對象的地方,我們可以用繼承類型的對象來替代。意味着,接受一個iostream類型引用(或指針)參數的函數,可以用一個對應的fstream(或sstream)類型來調用。 -
成員函數open和close.
當一個fstream對象被銷燬時,close會自動被調用 -
文件模式.
每個流都有一個關聯的文件模式,用來指出如何使用文件
與ifstream關聯的文件默認以in模式打開;
與ofstream關聯的文件默認以out模式打開;
與fstream關聯的文件默認以in和out模式打開;
8.3 string流
-
isstringstream
從string讀取數據,ostringstream
向string寫入數據,stringstream
既可從string中讀數據也可向string寫數據
-
使用istringstream
-
使用ostringstream