整理自《C++Primer》
-
第八章之前涉及到IO的內(nèi)容
8.1 IO類
-
三個(gè)頭文件9個(gè)io對(duì)象
繼承關(guān)系
- 基礎(chǔ)IO類ios類有兩個(gè)派生類:istream(通用輸入流類),ostream(通用輸出流類)蹄葱。
- istream派生出 ifsteam(輸入文件流類)和istringstream(輸入字符串流類)厘贼;ostream派生出ofsteam(輸入文件流類)和ostringstream(輸入字符串流類)
- iostream(通用輸入輸出流類)鉆石繼承于istream和ostream啼止,之后派生出了fstream(輸入輸出文件流類)和stringstream(輸入輸出字符串類)
io對(duì)象沒(méi)有拷貝和賦值的操作
-
流狀態(tài)
確定一個(gè)流對(duì)象的狀態(tài)的最簡(jiǎn)單的方法是將他當(dāng)成一個(gè)條件來(lái)使用
while (cin>>word) //ok :讀操作成功
-
管理輸出緩沖
由于設(shè)備的寫操作可能很耗時(shí)娃胆,允許操作系統(tǒng)將多個(gè)輸出操作組合為單一的設(shè)備寫操作可以帶來(lái)很大的性能提升
- 導(dǎo)致緩沖刷新(數(shù)據(jù)真正寫入到輸出設(shè)備或者文件的)原因傅联,即刷緩存的時(shí)機(jī)
- 程序結(jié)束main函數(shù)return
- 緩沖區(qū)滿
- 操作符:endl(輸出換行并刷新),flush(刷新)0,ends(輸出空字符并刷新)
- unitbuff:使以后每次寫操作之后都刷一次緩存。 nounitbuff:回到正常的緩存模式
- 輸入流和輸出流的關(guān)聯(lián):如cin cerr關(guān)聯(lián)到cout,所以當(dāng)讀cin或者寫cerr的時(shí)候cout的緩沖區(qū)會(huì)被刷新(輸入之前忆绰,把所有沒(méi)輸出的先輸出了)
- 導(dǎo)致緩沖刷新(數(shù)據(jù)真正寫入到輸出設(shè)備或者文件的)原因傅联,即刷緩存的時(shí)機(jī)
8.2 文件輸入輸出
- 使用文件流對(duì)象
ifstream in(ifile); //構(gòu)造一個(gè)ifstream 并打開(kāi)給定文件 //也可以用下面的方式 ofstream out; //輸出文件流未關(guān)聯(lián)到任何文件 out.open(ofile); //關(guān)聯(lián) //關(guān)閉 in.close(); out.close();
上面代碼中 參數(shù)ifile和ofile在c++11中一個(gè)是一個(gè)string類型,老的標(biāo)準(zhǔn)只能是一個(gè)char *
- 自動(dòng)構(gòu)造和析構(gòu)
一個(gè)fstream對(duì)象離開(kāi)其作用域時(shí)可岂,fstream的析構(gòu)函數(shù)被調(diào)用错敢,之前關(guān)聯(lián)的文件自動(dòng)關(guān)閉。
-
文件模式
限制:
8.3 string流
用于從string讀數(shù)據(jù)缕粹,向string寫數(shù)據(jù)
- 使用 istringstream
- 使用 ostringstream
string s;
istringstream is("mack pitt jane joe");
while(is>>s)
{
cout <<s<<endl;
}
再如二叉樹(shù)的序列化與反序列化 中 split函數(shù)的實(shí)現(xiàn)
15.7節(jié) IO庫(kù)再探
只要涉及三部分內(nèi)容稚茅,格式化輸入輸出,未格式化IO和隨機(jī)訪問(wèn)
-
格式化輸入輸出
用操作符來(lái)修改流的格式狀態(tài)平斩,操作符有兩大類輸出控制:控制數(shù)值的輸出形式以及控制補(bǔ)白的數(shù)量和位置亚享。當(dāng)操作符改變流的格式狀態(tài)時(shí),通常改變后的狀態(tài)對(duì)后續(xù)的IO都生效绘面,通常在不再需要特殊格式的時(shí)候盡快將流恢復(fù)到默認(rèn)狀態(tài)欺税。
- 輸出格式控制
操作符 格式控制 boolalpha/noboolalpha 布爾值的格式(輸出1/0還是true/false) oct 輸出八進(jìn)制整數(shù) hex 輸出十六八進(jìn)制整數(shù) dec 輸出十進(jìn)制(默認(rèn)) showbase/noshowbase 在輸出中指出進(jìn)制(加不加前導(dǎo):0x十六進(jìn)制 0八進(jìn)制) cout.precision(3) 設(shè)置打印精度為3位數(shù)字,默認(rèn)精度為6位 setprecision(3) 效果同上 (注:setprecision和其他接收精度的操作符定義在頭文件iomanip中 scientifc 浮點(diǎn)數(shù)計(jì)數(shù)法為科學(xué)計(jì)數(shù)法 fixed 浮點(diǎn)數(shù)計(jì)數(shù)法為點(diǎn)分十進(jìn)制 hexfloalt 浮點(diǎn)數(shù)計(jì)數(shù)法為十六進(jìn)制計(jì)數(shù)法 defaultfoalt 恢復(fù)默認(rèn)浮點(diǎn)數(shù)計(jì)數(shù)法 注意 defaultfoalt,hexfloalt,fixed使用過(guò)后,再設(shè)置精度飒货,則精度位數(shù)代表的是小數(shù)點(diǎn)后的位數(shù)魄衅,默認(rèn)情況下代表的是數(shù)字的總位數(shù) showpoint/noshowpoint 即使是整數(shù)也要打印出小數(shù)點(diǎn)以及后面的位數(shù) setw(12) 指定下一個(gè)輸出的項(xiàng)所占的位數(shù),此操作符不改變流的狀態(tài)塘辅,只對(duì)下一個(gè)項(xiàng)生效 left/right 左對(duì)齊還是右對(duì)齊(默認(rèn)) internal 負(fù)號(hào)是緊跟在數(shù)字前面還是左對(duì)齊 setfill 指定字符代替空白來(lái)輸出 - 輸入格式控制
默認(rèn)情況下晃虫,輸入運(yùn)算符會(huì)忽略空白符,(空格符扣墩,制表符哲银,換行符,換紙符呻惕,回車符)荆责,用noskip操作符會(huì)設(shè)置輸入運(yùn)算符讀取空白符,而不是跳過(guò)他們亚脆。
-
未格式化的輸入輸出
將流當(dāng)做一個(gè)無(wú)解釋的字節(jié)序列來(lái)處理做院。沒(méi)咋使用過(guò),以后用到了再看吧
-
流隨機(jī)訪問(wèn)
seek 重定位 tell告訴我們當(dāng)前位置
g是輸入流(istream,ifstream,istringstream)的版本,p是輸出流(ostream,ofstream,ostringstream)的版本