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