C++Primer 第8章IO流
C++Primer 第8章 IO流
- 寫(xiě)在前面
- 首先是main()處理命令行選項(xiàng),后面會(huì)用到
- IO類(lèi)
- iostream
- a.條件狀態(tài)
- b.輸出緩沖
- fstream
- a.fstream 特有的操作
- b.使用
- c.文件模式
- sstream
- a.特有操作
- b.使用
寫(xiě)在前面
經(jīng)過(guò)前面初級(jí)部分的學(xué)習(xí),我進(jìn)入該書(shū)所寫(xiě)的中級(jí)階段——C++標(biāo)準(zhǔn)庫(kù),這里會(huì)講到C++所自帶的最核心的標(biāo)準(zhǔn)庫(kù),之前聽(tīng)過(guò)侯捷老師的課,有幸感受到標(biāo)準(zhǔn)庫(kù)的強(qiáng)大與精妙。正如本書(shū)所說(shuō),標(biāo)準(zhǔn)庫(kù)是值得每一位C++程序員應(yīng)該掌握的。這里給自己鼓勁!
附上幾張我上周末終南山的照片:
是挺美的,不過(guò)我去的時(shí)候剛好遇上下雨,行走在云中,能見(jiàn)距離不到10m,看不見(jiàn)遠(yuǎn)處的景吧,但是也別有一番夢(mèng)境的氛圍哈哈哈。
下面開(kāi)始言歸正傳!
做個(gè)總結(jié)吧,我會(huì)更改我之前的寫(xiě)博文的風(fēng)格的,之前的博文風(fēng)格十分狂野,只有代碼沒(méi)有解釋,這對(duì)于我的讀者,或者我之后的查閱復(fù)習(xí)都非常的不方便。
那么我將會(huì)在之后的文章中,盡可能的解釋清楚每一個(gè)知識(shí)點(diǎn),這對(duì)我也是算是一種新嘗試吧,希望我能堅(jiān)持下去!
首先是main()處理命令行選項(xiàng),后面會(huì)用到
int main(){}這個(gè)東西其實(shí)是可以有時(shí)也是需要傳入實(shí)參的,
int main(int argc,char **argv){} //也可以寫(xiě)成: int main(int argc,char *argv[]){}這里傳入的第二個(gè)參數(shù)是一個(gè)char數(shù)組的指針,所以使用**表示我個(gè)人感覺(jué)更加通俗一些,這樣argv[]里面的數(shù)據(jù)就可以在主函數(shù)塊中被調(diào)用起來(lái)(p196)。值得注意的是該數(shù)組最后一個(gè)數(shù)據(jù)應(yīng)當(dāng)為0,并且自動(dòng)生成。
IO類(lèi)
分為iostream、fstream、sstream
后兩者繼承于第一個(gè)
iostream用于控制流,fstream用于控制文件,sstream用于控制字符串,這三每個(gè)又分為讀和寫(xiě)兩個(gè)頭文件,為了方便起見(jiàn),直接include以上三種就可以同時(shí)操作讀和寫(xiě)了,當(dāng)然也可以單獨(dú)的指定。
iostream
這中類(lèi)對(duì)象不能賦值、拷貝和初始化。
a.條件狀態(tài)
流在執(zhí)行的時(shí)候的狀態(tài)可以用這些來(lái)表示:
//8.1.2 #include<iostream> #include<stdexcept> using namespace std; int main() {//1int ival;while (cin >> ival){//8.3/*遇見(jiàn)結(jié)束符,與io錯(cuò)誤時(shí),返回false*/cout << ival << endl;} } //那么如何查詢(xún)呢我們輸入失敗在哪里呢 //2 //8.1,8.2 #include<iostream> #include<stdexcept> using namespace std; istream& f(istream& in) {int v;while (in >> v, !in.eof()){//遇見(jiàn)文件結(jié)束符,其他的在p280if (in.bad()) //badbit置位throw runtime_error("IO流錯(cuò)誤");if (in.fail()) //failbit置位或badbit置位{cerr << "數(shù)據(jù)錯(cuò)誤,請(qǐng)重試" << endl;in.clear(); //復(fù)位in.ignore(100, '\n'); //不管當(dāng)前之后的100個(gè)字符,第101個(gè)重新進(jìn)入循環(huán)continue;}cout << v << endl;} } int main() {//輸入一些整數(shù)f(cin); }b.輸出緩沖
每個(gè)輸出流都有一個(gè)緩沖流,因?yàn)樽x入計(jì)算機(jī)需要耗時(shí),那么緩存一起讀入則會(huì)提高性能。
有以下操作可以使得緩沖區(qū)被刷新:
But,我們需要注意的時(shí)程序崩潰時(shí),緩沖區(qū)不會(huì)被刷新。
但是,p283tie沒(méi)看懂呀。。。
fstream
fstream繼承于iostream因此父類(lèi)的操作fstream也可以操作
a.fstream 特有的操作
構(gòu)造函數(shù):fstream fstr(s, mode); 打開(kāi)s文件,mode為打開(kāi)模式默認(rèn)依賴(lài)于fstream fstr.open(s); 打開(kāi)s并與fstr綁定,這里的s可以時(shí)一個(gè)字符串哦,也有默認(rèn)mode fstr.close(); 關(guān)閉fstr綁定的文件 str.is_open() 返回bool,檢查是否打開(kāi)成功b.使用
//8.4 #include<iostream> #include<fstream> #include<string> #include<vector> using namespace std;int main() {ifstream in("data");if (!in)cerr << "無(wú)法打開(kāi)文件" << endl;string line;vector<string> words;while (cin>>line)words.push_back(line);in.close();for (auto i : words)cout << i << endl; }c.文件模式
這里介紹的也就是mode:
in 讀方式 out 寫(xiě)方式 app 寫(xiě)操作定位到文件尾 ate 打開(kāi)立即定位到文件尾 trunc 截?cái)辔募?binary 以二進(jìn)制j進(jìn)行IO//8.5
cin改為getline
//8.8
加入?yún)?shù)app
sstream
這個(gè)家伙是處理字符串的,同樣繼承于iostream
a.特有操作
構(gòu)造函數(shù):sstream sstr(s) 保存一個(gè)string的拷貝 sstr.str() 返回string的拷貝 sstr.str(s) 將s拷貝到sstr中b.使用
//8.9 #include<iostream> #include<string> #include<sstream> #include<stdexcept> using namespace std; istream& f(istream& in) {string str;while (in >> str, !in.eof()){//遇見(jiàn)文件結(jié)束符,其他的在p280if (in.bad()) //badbit置位throw runtime_error("IO流錯(cuò)誤");if (in.fail()) //failbit置位或badbit置位{cerr << "數(shù)據(jù)錯(cuò)誤,請(qǐng)重試" << endl;in.clear(); //復(fù)位in.ignore(100, '\n'); //不管當(dāng)前之后的100個(gè)字符,第101個(gè)重新進(jìn)入循環(huán)continue;}cout << str << endl;} } int main() {//輸入一些字符串f(cin); } //8.10 #include<iostream> #include<fstream> #include<sstream> #include<string> #include<vector> using namespace std; int main() {ifstream in("data");if (!in)cerr << "無(wú)法打開(kāi)文件" << endl;string line;vector<string> words;while (getline(in, line))words.push_back(line);in.close();for (auto i : words)cout << i << endl;in.close();for (auto it : words){istringstream itline(it);string word;while (itline >> word)cout << word << " ";cout << endl;} }這里8.3.2沒(méi)有做解釋,留到第17章吧。
總結(jié)
以上是生活随笔為你收集整理的C++Primer 第8章IO流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle会闪,Oracle闪来操作
- 下一篇: C++Primer 第10章lambda