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