IO庫
- [x] istream(輸入流)類型,提供輸入操作
- [x] ostream(輸出流)類型,提供輸出操作
- [x] cin励负,一個(gè)istream對象绪抛,從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)
- [x] cout,一個(gè)ostream對象,向標(biāo)準(zhǔn)輸出寫入數(shù)據(jù)
- [x] cerr紫新,一個(gè)ostream對象,通常用于輸出程序錯(cuò)誤消息李剖,寫入到標(biāo)準(zhǔn)錯(cuò)誤
- [x] >>運(yùn)算符芒率,用來從一個(gè)istream對象讀取輸入數(shù)據(jù)
- [x] <<運(yùn)算符,用來向一個(gè)ostream對象寫入輸出數(shù)據(jù)
- [x] getline函數(shù)篙顺,從一個(gè)給定的istream讀取一行數(shù)據(jù)偶芍,存入一個(gè)給定的string對象中
IO類
管理輸出緩沖
- 緩沖機(jī)制,操作系統(tǒng)就可以將程序的多個(gè)輸出操作組合成單一的系統(tǒng)級寫操作
- 由于設(shè)備的寫操作可能會很耗時(shí)德玫,允許操作系統(tǒng)將多個(gè)輸出操作組合為單一的設(shè)備寫操作可以帶來很大的性能提升
- 導(dǎo)致緩沖刷新(即數(shù)據(jù)真正寫到輸出設(shè)備或文件)的原因有如下幾個(gè):
- [x] 程序正常結(jié)束匪蟀,作為main函數(shù)的return操作的一部分,緩沖刷新被執(zhí)行
- [x] 緩沖區(qū)滿時(shí)宰僧,需要刷新緩沖材彪,而后新的數(shù)據(jù)才能繼續(xù)寫入緩沖區(qū)
- [x] 可以使用操作符endl來顯式刷新緩沖區(qū)
- [x] 在每個(gè)輸出操作之后,我們可以用操作符unitbuf設(shè)置流的內(nèi)部狀態(tài)撒桨,來情況緩沖區(qū)查刻,默認(rèn)情況下,對cerr是設(shè)置unitbuf的凤类,因此寫道cerr的內(nèi)容是立即刷新的
- [x] 一個(gè)輸出流可能被關(guān)聯(lián)到另一個(gè)流穗泵,在這種情況下,當(dāng)讀寫被關(guān)聯(lián)的流時(shí)谜疤,關(guān)聯(lián)到的流的緩沖區(qū)會被刷新佃延,例如,默認(rèn)情況下夷磕,cin和cerr都關(guān)聯(lián)到cout履肃,因此,讀cin或?qū)慶err都會導(dǎo)致cout的緩沖區(qū)被刷新
- [x] 操縱符`endl`坐桩,`flush`以及`ends`可以刷新緩沖區(qū)
cout<<"hi!"<<endl; //輸出hi和一個(gè)換行符尺棋,然后刷新緩沖區(qū)
cout<<"hi!"<<flush; //輸出hi,然后刷新緩沖區(qū)绵跷,不附加任何額外字符
cout<<"hi!"<<ends; //輸出hi和一個(gè)空字符膘螟,然后刷新緩沖區(qū)
- [x] 如果想在每次輸出操作之后都刷新緩沖區(qū)碾局,我們可以使用unitbuf操縱符荆残,它告訴流在接下來的每次寫操作之后進(jìn)行一次flush操作净当,而nounitbuf操縱符則重置流蕴潦,使其恢復(fù)使用正常的系統(tǒng)管理的緩沖區(qū)刷新機(jī)制
cout << unitbuf; //所有輸出操作后都會立即刷新緩沖區(qū)
cout << nounitbuf; //回到正常的緩沖方式
文件輸入輸出
- 頭文件
fstream
定義了三個(gè)類型來支持文件的IO操作
- [x] ifstream俘闯,從一個(gè)給定文件讀取數(shù)據(jù)
- [x] ofstream潭苞,向一個(gè)給定文件寫入數(shù)據(jù)
- [x] fstream,可以讀寫給定文件
使用文件流對象
ifstream input(strInFile);
ofstream output(strOutFile);
Sales_data total;
read(input,total);
//通過ifstream將數(shù)據(jù)讀取到total
- 一旦一個(gè)文件流已經(jīng)打開萄传,它就保持與對應(yīng)文件的關(guān)聯(lián),在關(guān)聯(lián)關(guān)閉之前,無法被其他文件流關(guān)聯(lián)
- 當(dāng)一個(gè)
fstream
對象被銷毀時(shí)振诬,close會自動調(diào)用
文件模式
- 每一個(gè)流都有一個(gè)關(guān)聯(lián)的
文件模式
蹭睡,用來指出如何使用文件
in 以讀方式打開
out 以寫方式打開
app 每次寫操作前定位到文件末尾
ate 打開文件后立即定位到文件末尾
trunc 截?cái)辔募?binary 以二進(jìn)制方式進(jìn)行IO操作
- 無論哪種方式打開文件,都可以指定文件模式赶么,調(diào)用open打開文件時(shí)可以肩豁,用一個(gè)文件名初始化流來隱式打開文件時(shí)也可以
- 以out模式打開文件會丟棄已有數(shù)據(jù)
- [x] 默認(rèn)情況下辫呻,當(dāng)我們打開一個(gè)ofstream時(shí)清钥,文件的內(nèi)容會被丟棄
- [x] 保留被ofstream打開的文件中已有數(shù)據(jù)的唯一方法是顯式指定app或in模式
- 每次調(diào)用open時(shí)都會確定文件模式
- [x] 在每次打開文件時(shí)放闺,都要設(shè)置文件模式,可能是顯式的設(shè)置怖侦,也可能是隱式的設(shè)置,當(dāng)程序未指定模式時(shí)搬葬,就是用默認(rèn)值
string流
-
sstream
頭文件定義了三個(gè)類型來支持內(nèi)存IO,這些類型可以向string寫入數(shù)據(jù)急凰,從string讀取數(shù)據(jù),就像string是一個(gè)IO流一樣
- [x] `istringstream`從string讀取數(shù)據(jù)
- [x] `ostringstream`向string寫入數(shù)據(jù)
- [x] `stringstream`既可以從string讀取數(shù)據(jù)也可以向string寫入數(shù)據(jù)
- 與
fstream
類型類似抡锈,頭文件sstream
中定義的類型都繼承自iostream
頭文件中定義的類型
istringstream使用
- 當(dāng)需要對整行文本進(jìn)行處理码倦,而其他一些工作是處理行內(nèi)單個(gè)單詞時(shí),通常使用istringstream