C++primer第八章 IO库 8.3string流
生活随笔
收集整理的這篇文章主要介紹了
C++primer第八章 IO库 8.3string流
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
8.3string流
- sstream頭文件定義了三個(gè)類型來支持內(nèi)存IO,這些類型可以向string寫入數(shù)據(jù),從string讀取數(shù)據(jù),就像string是一個(gè)IO流一樣。
- istringstream從string讀取數(shù)據(jù),ostringstream向string寫入數(shù)據(jù),而頭文件stringstream既可從string讀數(shù)據(jù)也可向string寫數(shù)據(jù)。與fstream類型類似,頭文件sstream中定義的類型都繼承自我們已經(jīng)使用過的iostream頭文件定義的類型。除了繼承得來的操作,sstream中定義的類型還增加了一些成員來管理與流相關(guān)聯(lián)的stringo表8.5列出了這些操作,可以對(duì)stringstream對(duì)象調(diào)用這些操作,但不能對(duì)其他IO類型調(diào)用這些操作。
8.3.1 使用 istringstream
- 當(dāng)我們的某些工作是對(duì)整行文本進(jìn)行處理,而其他一些工作是處理行內(nèi)的單個(gè)單詞時(shí),通常可以使用istringstream。
- 考慮這樣一個(gè)例子,假定有一個(gè)文件,列出了一些人和他們的電話號(hào)碼。某些人只有一個(gè)號(hào)碼,而另一些人則有多個(gè)-- 家庭電話、工作電話、移動(dòng)電話等。我們的輸入文件看起來可能是這樣的:morgan 2015552368 8625550123 drew 9735550130 lee 6095550132 2015550175 8005550000
- 文件中每條記錄都以一個(gè)人名開始,后面跟隨一個(gè)或多個(gè)電話號(hào)碼。我們首先定義一個(gè)簡(jiǎn)單的類來描述輸入數(shù)據(jù):
/ / 成員默認(rèn)為公有;參見 7.2節(jié) (第 240頁(yè) )struct Personinfo ( string name; vector<string> phones;};類型Personinfo的對(duì)象會(huì)有一個(gè)成員來表示人名,還有一個(gè)vector來保存此人的所 有電話號(hào)碼。 - ?我們的程序會(huì)讀取數(shù)據(jù)文件,并創(chuàng)建一個(gè)Personinfo的vectoro vector中每個(gè)元素對(duì)應(yīng)文件中的一條記錄。我們?cè)谝粋€(gè)循環(huán)中處理輸入數(shù)據(jù),每個(gè)循環(huán)步讀取一條記錄,提取出一個(gè)人名和若干電話號(hào)碼:
- 這里我們用getline從標(biāo)準(zhǔn)輸入讀取整條記錄。如果 getline調(diào)用成功,那 么 line 中將保存著從輸入文件而來的一條記錄。在 while中,我們定義了一個(gè)局部Personlnfo對(duì)象,來保存當(dāng)前記錄中的數(shù)據(jù)。接下來我們將一個(gè)istringstream與剛剛讀取的文本行進(jìn)行綁定,這樣就可以在 此 istringstream上使用輸入運(yùn)算符來讀取當(dāng)前記錄中的每個(gè)元素。我們首先讀取人 名,隨后用一個(gè)while循環(huán)讀取此人的電話號(hào)碼。 當(dāng)讀取完line中所有數(shù)據(jù)后,內(nèi)層while循環(huán)就結(jié)束了。此循環(huán)的工作方式與前 面章節(jié)中讀取cin的循環(huán)很相似,不同之處是,此循環(huán)從一個(gè)string而不是標(biāo)準(zhǔn)輸入 讀取數(shù)據(jù)。當(dāng) string中的數(shù)據(jù)全部讀出后,同樣會(huì)觸發(fā)“文件結(jié)束”信號(hào),在 record 上的下一個(gè)輸入操作會(huì)失敗。
- 我們將剛剛處理好的Personinfo追加到vector中,外層while循環(huán)的一個(gè)循環(huán) 步就隨之結(jié)束了。外層while循環(huán)會(huì)持續(xù)執(zhí)行,直至遇到cin的文件結(jié)束標(biāo)識(shí)。
8.3.2使用ostringstream
- 當(dāng)我們逐步構(gòu)造輸出,希望最后一起打印時(shí),ostringstream是很有用的。例如,對(duì)上一節(jié)的例子,我們可能想逐個(gè)驗(yàn)證電話號(hào)碼并改變其格式。如果所有號(hào)碼都是有效的,我們希望輸出一個(gè)新的文件,包含改變格式后的號(hào)碼。對(duì)于那些無效的號(hào)碼,我們不會(huì)將它們輸出到新文件中,而是打印一條包含人名和無效號(hào)碼的錯(cuò)誤信息。
- 由于我們不希望輸出有無效電話號(hào)碼的人,因此對(duì)每個(gè)人,直到驗(yàn)證完所有電話號(hào)碼后才可以進(jìn)行輸出操作。但是,我們可以先將輸出內(nèi)容“寫入”到一個(gè)內(nèi)存ostringstream中:
- 在此程序中,我們假定已有兩個(gè)函數(shù),valid和format,分別完成電話號(hào)碼驗(yàn)證和改變格式的功能。程序最有趣的部分是對(duì)字符串流formatted和badNums的使用。我們使用標(biāo)準(zhǔn)的輸出運(yùn)算符(<<)向這些對(duì)象寫入數(shù)據(jù),但這些“寫入操作實(shí)際上轉(zhuǎn)換為string操作,分別向formatted和badNums中的string對(duì)象添加字符。
C++使用標(biāo)準(zhǔn)庫(kù)類來處理面向流的輸入和輸出:
- iostream處理控制臺(tái)IO
- fstream處理命名文件IO
- stringstream完成內(nèi)存string的IO
- 類fstream和stringstream都是繼承自類iostream的。輸入類都繼承自istream,輸出類都繼承自ostream。因此,可以在istream對(duì)象上執(zhí)行的操作,也可在ifstream或istringstream對(duì)象上執(zhí)行。繼承自ostream的輸出類也有類似情況。
- 每個(gè)IO對(duì)象都維護(hù)一組條件狀態(tài),用來指出此對(duì)象上是否可以進(jìn)行IO操作。如果遇到了錯(cuò)誤--例如在輸入流上遇到了文件末尾,則對(duì)象的狀態(tài)變?yōu)槭?#xff0c;所有后續(xù)輸入操作都不能執(zhí)行,直至錯(cuò)誤被糾正。標(biāo)準(zhǔn)庫(kù)提供了一組函數(shù),用來設(shè)置和檢測(cè)這些狀態(tài)。
術(shù)語(yǔ)表
- 條件狀態(tài)(conditionstate)可被任何流類使用的一組標(biāo)志和函數(shù),用來指出給定流是否可用。
- 文件模式(filemode)類fstream定義的一組標(biāo)志,在打開文件時(shí)指定,用來控制文件如何被使用。
- 文件流(filestream)用來讀寫命名文件的流對(duì)象。除了普通的iostream操作,文件流還定義了open和close成員。成員函數(shù)open接受一個(gè)string或一個(gè)C風(fēng)格字符串參數(shù),指定要打開的文件名,它還可以接受一個(gè)可選的參數(shù),指明文件打開模式。成員函數(shù)close關(guān)閉流所關(guān)聯(lián)的文件,調(diào)用close后才可以調(diào)用open打開另一個(gè)文件
- fstream用于同時(shí)讀寫一個(gè)相同文件的文件流。默認(rèn)情況下,fstream以in和out模式打開文件。
- ifstream用于從輸入文件讀取數(shù)據(jù)的文件流。默認(rèn)情況下,ifstream以in模式打開文件。
- 繼承(inheritance)程序設(shè)計(jì)功能,令一個(gè)類型可以從另一個(gè)類型繼承接口。類ifstream和istringstream繼承自istream,ofstream和ostringstream繼承自ostream。第15章將介紹繼承
- istringstream用來從給定string讀取數(shù)據(jù)的字符串流。
- ofstream用來向輸出文件寫入數(shù)據(jù)的文件流。默認(rèn)情況下,ofstream以out模式打開文件
- 字符串流(stringstream)用于讀寫string的流對(duì)象。除了普通的iostream操作外,字符串流還定義了一個(gè)名為str的重載成員。調(diào)用str的無參版本會(huì)返回字符串流關(guān)聯(lián)的string。調(diào)用時(shí)傳遞給它一個(gè)string參數(shù),則會(huì)將字符串流與該string的一個(gè)拷貝相關(guān)聯(lián)。
- stringstream用于讀寫給定string的字符串流。
總結(jié)
以上是生活随笔為你收集整理的C++primer第八章 IO库 8.3string流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 未出账的白条怎么提前还款 京东白条未出账
- 下一篇: 操作系统面试 总结