C++ primer 第8章 IO库
文章目錄
- IO庫(kù)類型和頭文件
- IO對(duì)象無(wú)拷貝或賦值
- IO流的條件狀態(tài)
- 文件輸入輸出
- ifstream 示例
- ofstream 示例
- 文件模式
- 以out模式打開文件會(huì)丟棄已有數(shù)據(jù)
- 每次調(diào)用open時(shí)都會(huì)確定文件模式
- ofstream 保留源文件 追加數(shù)據(jù) 示例
- string流
- istringstream示例
- ostringstream示例
IO庫(kù)類型和頭文件
為了支持不同種類的IO處理操作,標(biāo)準(zhǔn)庫(kù)定義了一些IO類型。
iostream定義了用于讀寫流的基本類型。fstream定義了讀寫命名文件的類型。sstream定義了讀寫內(nèi)存string對(duì)象的類型。
類型ifstream和istringstream都繼承自istream,因此,我們可以像使用istream對(duì)象一樣來(lái)使用ifstream和istringstream。
IO對(duì)象無(wú)拷貝或賦值
由于不能拷貝IO對(duì)象,因此我們也不能將形參或返回類型設(shè)置為流類型。進(jìn)行IO操作的函數(shù)通常以引用方式傳遞和返回流。讀寫一個(gè)IO對(duì)象會(huì)改變其狀態(tài),因此傳遞和返回的引用不能是const的。
IO流的條件狀態(tài)
一個(gè)流一旦發(fā)生錯(cuò)誤,其上后續(xù)的IO操作都會(huì)失敗。只有當(dāng)一個(gè)流處于無(wú)錯(cuò)狀態(tài)時(shí),我們才可以從它讀取數(shù)據(jù),向它寫入數(shù)據(jù)。由于流可能處于錯(cuò)誤狀態(tài),因此代碼通常應(yīng)該在使用一個(gè)流之前檢查它是否處于良好狀態(tài)。確定一個(gè)流對(duì)象的狀態(tài)的最簡(jiǎn)單的方法是將它當(dāng)做一個(gè)條件使用。
badbit表示系統(tǒng)級(jí)錯(cuò)誤,如不可恢復(fù)的讀寫錯(cuò)誤。通常情況下,一旦badbit被置位,流就無(wú)法再使用了。在發(fā)生可恢復(fù)錯(cuò)誤后,failbit被置位,如期望讀取數(shù)值卻讀出一個(gè)字符等錯(cuò)誤。這種問(wèn)題通常是可以修正的,流還可以繼續(xù)使用。如果到達(dá)文件結(jié)束位置,eofbit和failbit都會(huì)被置位。goodbit的值為0,表示流未發(fā)生錯(cuò)誤。如果badbit、failbit和eofbit任一個(gè)被置位,則檢測(cè)流狀態(tài)的條件會(huì)失敗。
文件輸入輸出
頭文件fstream定義了三個(gè)類型來(lái)支持文件IO:ifstream從一個(gè)給定文件讀取數(shù)據(jù),ofstream向一個(gè)給定文件寫入數(shù)據(jù),以及fstream可以讀寫給定文件。
創(chuàng)建文件流對(duì)象時(shí),我們可以提供文件名(可選的)。如果提供了一個(gè)文件名,則open成員函數(shù)會(huì)自動(dòng)被調(diào)用,示例如下:
在要求使用基類型對(duì)象的地方,我們可以用繼承類型的對(duì)象來(lái)替代。這意味著,接受一個(gè)iostream類型引用(或指針)參數(shù)的函數(shù),可以用一個(gè)對(duì)應(yīng)的fstream(或sstream)類型來(lái)調(diào)用。也就是說(shuō),如果有一個(gè)函數(shù)接受一個(gè)ostream&參數(shù),我們?cè)谡{(diào)用這個(gè)函數(shù)時(shí),可以傳遞給它一個(gè)ofstream對(duì)象,對(duì)istream&和ifstream也是類似的。
流如果調(diào)用open失敗,failbit會(huì)被置位。對(duì)一個(gè)已經(jīng)打開的文件流調(diào)用open會(huì)失敗,并會(huì)導(dǎo)致failbit被置位。隨后的試圖使用文件流的操作都會(huì)失敗。為了將文件流關(guān)聯(lián)到另外一個(gè)文件,必須首先關(guān)閉已經(jīng)關(guān)聯(lián)的文件。一旦文件成功關(guān)閉,我們就可以打開新的文件關(guān)聯(lián)新的文件。
當(dāng)一個(gè)fstream對(duì)象被銷毀時(shí),close會(huì)自動(dòng)被調(diào)用。
ifstream 示例
打開string文件,按行存儲(chǔ)元素,str即是每一行的string
ifstream in("text.txt"); string str; getline(in,str);將每一個(gè)單詞作為一個(gè)獨(dú)立的元素進(jìn)行存儲(chǔ)
ifstream in("text.txt"); string str; in>>str;ofstream 示例
ofstream ofs("test.txt"); ofs << "hello"<<" world"<<endl;文件模式
每個(gè)流都有一個(gè)關(guān)聯(lián)的文件模式,用來(lái)指出如何使用文件。
以out模式打開文件會(huì)丟棄已有數(shù)據(jù)
默認(rèn)情況下,我們打開一個(gè)ofstream時(shí),文件的內(nèi)容會(huì)被丟棄。阻止一個(gè)ofstream清空給定文件內(nèi)容的方法是同時(shí)指定app模式。
保留被ofstream打開的文件中已有數(shù)據(jù)的唯一方法是顯式指定app或in模式。
每次調(diào)用open時(shí)都會(huì)確定文件模式
通常情況下,out模式意味著同時(shí)使用trunc模式,即當(dāng)前文件內(nèi)容將被清空。當(dāng)指定app模式時(shí),文件中的已有數(shù)據(jù)得以保留,所有寫操作都在文件末尾進(jìn)行。
ofstream 保留源文件 追加數(shù)據(jù) 示例
ofstream ofs("test.txt",ofstream::app); ofs << "hello"<<" world"<<endl;string流
sstream頭文件定義了三個(gè)類型來(lái)支持內(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ù)。
istringstream示例
以整行為元素讀取文件,存入vector中,并用istringstream從vector中讀取元素,每次讀取一個(gè)單詞
ifstream ifs("test.txt");string str;vector<string>vec;while (getline(ifs,str)) {vec.push_back(str);}for (auto a:vec) {istringstream vecStr(a);string tmp;while(vecStr >> tmp)cout << tmp<<endl;}ostringstream示例
ostringstream os; os << "hello" << " world" << endl; cout << os.str();此時(shí)界面上會(huì)顯示hello world
總結(jié)
以上是生活随笔為你收集整理的C++ primer 第8章 IO库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WebLogic启动失败:java.la
- 下一篇: 北京老虎吃人(八达岭东北虎吃人视频)