C++(八):iostream讀寫操作

IO庫

在前面已經(jīng)用過了大部分的IO庫設(shè)施:

  • istream類型
  • ostream類型
  • cin炸站,一個istream對象
  • cout曹宴,一個ostream對象
  • cerr,一個ostream對象,用于輸出程序錯誤消息
  • >>運算符竹伸,用于從istream對象讀入數(shù)據(jù)
  • <<運算符,用于向ostream對象輸出數(shù)據(jù)
  • getline函數(shù)簇宽,從一個給的的istream讀取一行數(shù)據(jù)存入給定的string對象中勋篓。

8.1 IO類

到目前為止用到的IO類型和對象都是操縱char數(shù)據(jù)的。但是除此之外還有讀寫文件的類型及讀寫string對象的類型魏割。

image.png

8.1.1 IO對象無拷貝或賦值

不能夠拷貝或?qū)O對象賦值譬嚣,也不能將形參或返回類型設(shè)置為流類型。IO操作的函數(shù)通常以引用方式傳遞和返回流钞它,讀寫一個IO對象會改變其狀態(tài)拜银,因此傳遞和返回的引用不能說const的。

8.1.2 條件狀態(tài)

IO操作可能會引發(fā)錯誤遭垛,產(chǎn)生錯誤時IO的狀態(tài)會發(fā)生改變尼桶,所以IO庫有些函數(shù)和標志可以幫助我們訪問和操縱流的條件狀態(tài)。

image.png
image.png

查詢流的狀態(tài):IO庫定義了一個與機器無關(guān)的iostate類型耻卡,提供了表達流狀態(tài)的完整功能疯汁。

其中badbit表示系統(tǒng)級錯誤,如不可恢復(fù)的讀寫錯誤卵酪,一旦被置位流就無法再使用了幌蚊。在發(fā)生可恢復(fù)錯誤后,failbit被置位溃卡,這個是可以修正的溢豆。如果到達文件結(jié)束位置,eofbit和failbit會被置位瘸羡。goodbit為0漩仙,表示流未發(fā)生錯誤。

管理條件狀態(tài):流對象的rdstate成員返回一個iostate值犹赖,對應(yīng)流的當(dāng)前狀態(tài)队他。setstate操作將給定條件值置位,表示發(fā)生了對應(yīng)錯誤峻村。clear函數(shù)不接受參數(shù)的版本復(fù)位所有錯誤標志麸折,帶參數(shù)的clear成員函數(shù)接受一個iostate值,可以復(fù)位單一的條件狀態(tài)位粘昨。

8.1.3 管理輸出緩沖

每個輸出流都管理一個緩沖區(qū)垢啼,用于保存程序讀寫的程序窜锯。因為操作系統(tǒng)中存在緩沖機制,將程序中多個輸出操作組合成單一的系統(tǒng)級寫操作芭析,這樣可以避免頻繁且零碎的設(shè)備寫操作锚扎,提升系統(tǒng)性能。

導(dǎo)致緩沖刷新(系統(tǒng)寫操作)的原因有很多:

  • 程序正常結(jié)束
  • 緩沖區(qū)滿
  • 用操縱符endl來顯示刷新緩沖區(qū)
  • 在每個輸出操作之后馁启,可以用操縱符unitbuf設(shè)置流的內(nèi)部狀態(tài)驾孔,來清空緩沖區(qū)。默認情況下进统,對cerr是設(shè)置unitbuf的助币,所以寫道cerr的內(nèi)容是立即刷新的。
  • 一個輸出流可能被關(guān)聯(lián)到另一個流螟碎。這時讀寫被關(guān)聯(lián)的流時眉菱,關(guān)聯(lián)到的流的緩沖區(qū)也會被刷新。

刷新輸出緩沖區(qū):用操縱符endl可以完成換行和緩沖區(qū)的刷新掉分。IO庫中還有兩個類似的操縱符:flush和ends俭缓。flush刷新緩沖區(qū),但不輸出任何額外的字符酥郭;ends向緩沖區(qū)插入一個空字符华坦,然后刷新緩沖區(qū)。

unitbuf操縱符:使用unitbuf操縱符可以讓流在每次寫操作后都進行一次flush操作不从。而nounitbuf操縱符則重置流惜姐,使其恢復(fù)使用正常的系統(tǒng)管理的緩沖區(qū)刷新機制。

cout<<unitbuf;
cout<<nounitbuf;

關(guān)聯(lián)輸入和輸出流:當(dāng)一個輸入流被關(guān)聯(lián)到一個輸出流時,任何試圖從輸入流讀數(shù)據(jù)的操作都會先刷新關(guān)聯(lián)的輸出流。

tie有兩個重載的版本犀变;一個版本不帶參數(shù)握截,返回指向輸出流的指針倚舀。如果本對象當(dāng)前關(guān)聯(lián)到一個輸出流,則返回的就是指向這個流的指針,如果對象未關(guān)聯(lián)到流,則返回空指針孟抗。tie的第二個版本接受一個指向ostream的指針,將自己關(guān)聯(lián)到此ostream钻心。

cin.tie(&cout);
ostream *old_tie=cin.tie(nullptr);
cin.tie(&cerr);
cin.tie(old_tie);

每個流最多可以關(guān)聯(lián)一個流凄硼,但是多個流可以關(guān)聯(lián)到同一個流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捷沸,一起剝皮案震驚了整個濱河市帆喇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亿胸,老刑警劉巖坯钦,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侈玄,居然都是意外死亡婉刀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門序仙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來突颊,“玉大人,你說我怎么就攤上這事潘悼÷赏海” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵治唤,是天一觀的道長棒动。 經(jīng)常有香客問我,道長宾添,這世上最難降的妖魔是什么船惨? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缕陕,結(jié)果婚禮上粱锐,老公的妹妹穿的比我還像新娘。我一直安慰自己扛邑,他們只是感情好怜浅,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔬崩,像睡著了一般恶座。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舱殿,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天奥裸,我揣著相機與錄音,去河邊找鬼沪袭。 笑死湾宙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冈绊。 我是一名探鬼主播侠鳄,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼死宣!你這毒婦竟也來了伟恶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤毅该,失蹤者是張志新(化名)和其女友劉穎博秫,沒想到半個月后潦牛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挡育,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年巴碗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片即寒。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡橡淆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出母赵,到底是詐尸還是另有隱情逸爵,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布凹嘲,位于F島的核電站师倔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏施绎。R本人自食惡果不足惜溯革,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谷醉。 院中可真熱鬧致稀,春花似錦、人聲如沸俱尼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遇八。三九已至矛绘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刃永,已是汗流浹背货矮。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斯够,地道東北人囚玫。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像读规,于是被迫代替她去往敵國和親抓督。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • C++語言不直接處理輸入輸出束亏,而是通過一組定義在標準庫中的類型來處理IO铃在。這些類型支持從設(shè)備讀取數(shù)據(jù),向設(shè)備寫入數(shù)...
    夢中睡覺的巴子閱讀 204評論 0 0
  • [轉(zhuǎn)]C/C++ 文件讀寫操作總結(jié) 在編程的過程中,文件的操作是一個經(jīng)常用到的問題定铜,在C++Builder中阳液,可以...
    天之道天知道閱讀 5,194評論 0 7
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51
  • 1. 基礎(chǔ)知識 高級語言:接近自然語言的編程語言 編譯器:將C++源程序代碼轉(zhuǎn)換為二進制文件 運行:操作系統(tǒng)讀取二...
    吃掉夏天的怪物閱讀 232評論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險宿稀,但是人生放棄了冒險趁舀,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,041評論 0 4