【C++】iostream, fstream, stringstream知識

以前學習C++的時候, 總是囫圇吞棗地理解cin, cout等東東, 最近又在複習C++,  複習到IO類這一章節的時候, 有點感觸, 所以呢, 打算記錄一下。


         俗話說, 一圖勝過千言萬語, 這不是沒有道理的, 下面, 我們來看看基本IO類的繼承結構:



      在我們寫C++簡單代碼的時候, 最喜歡寫#include <iostream>  , 那麼, 這實際上是在包括IO流的頭文件, 而用using namespace std;則表示用標準空間, 這樣才能用cin,cout, endl等東東啊。

      從上圖看, 實際上可以把IO類分爲三類:

      1. iostream類: 負責與控制檯輸入輸出打交道, 這個我們已經很熟悉了。   注意: 實際具體又可以區分爲:istream和ostream

      2. fstream類:   負責與文件輸入輸出打交道, 這個我們接觸過。  注意: 實際具體又可以區分爲:ifstream和ofstream

      3. stringstream類:負責與string上的輸入輸出打交道, 這個我們暫時還真沒用過。  注意: 實際具體又可以區分爲:istringstream和ostringstream


       下面, 我們來一一學習/複習:

      1. IO類之iostream

          iostream類的對象, 如cin, cout, 會直接與控制檯輸入輸出關聯, 下面我們來看看最簡單的程序:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main()  
  5. {  
  6.     int i = -1;  
  7.       
  8.     cin >> i; // cin從控制檯接收輸入, 並保存在i中  
  9.   
  10.     cout << i << endl; // count把i的值輸出到控制檯  
  11.   
  12.     return 0;  
  13. }  

     很簡單很好理解吧。


     2. IO類值之fstream

      fstream的對象, 與文件建立關聯, 我們已經很熟悉了, 直接看代碼吧:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <string>  
  3. #include <fstream>  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     ifstream in("test.txt"); // 建立in與文件test.txt之間的額關聯  
  9.     if(!in)  
  10.     {  
  11.         cout << "error" << endl;  
  12.         return 1;  
  13.     }  
  14.   
  15.     string line;  
  16.     while(getline(in, line))  
  17.     {  
  18.         cout << line << endl;     
  19.     }  
  20.   
  21.     return 0;  
  22. }  

    3. IO類之stringstream

     stringstream的對象與內存中的string對象建立關聯, 往string對象寫東西, 或者從string對象讀取東西。

     我們先看這樣一個問題, 假設test.txt的內容爲:

lucy 123 

lili 234 456

tom 222 456 535

jim 2345 675 34 654

     其中每行第一個單詞是姓名, 後面的數字都是他們的銀行卡密碼, 當然啦, jim的銀行卡最多, 有4張, 現在, 要實現如下輸出, 該怎麼做呢?

lucy 123x 

lili 234x   456x 

tom 222x   456x   535x 

jim 2345x   675x   34x   654x 

     直接看程序吧:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <string>  
  3. #include <fstream>  
  4. #include <sstream>  
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     ifstream in("test.txt"); // 建立in與文件test.txt之間的額關聯  
  10.     if(!in)  
  11.     {  
  12.         cout << "error" << endl;  
  13.         return 1;  
  14.     }  
  15.   
  16.     string line;   
  17.     string password;  
  18.     while(getline(in, line))  
  19.     {  
  20.         istringstream ss(line); // 建立ss與line之間的關聯  
  21.         int i = 0;  
  22.         while(ss >> password) // ss從line讀取東西並保存在password中  
  23.         {     
  24.             cout << password + (1 == ++i ? "" : "x") << " ";  
  25.         }  
  26.           
  27.         cout << endl;  
  28.     }  
  29.   
  30.     return 0;  
  31. }  

       結果ok.

       

       下面, 我們來看看如何利用istringstream實現字符串向數值的轉化:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <string>  
  3. #include <sstream>  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     int a = -1;  
  9.     string s = "101";  
  10.     istringstream is(s); // 建立關聯  
  11.     cout << is.str() << endl; // 101,  看來is和s確實關聯起來了啊  
  12.   
  13.     is >> a;  
  14.   
  15.     cout << a << endl; // 101  
  16.   
  17.     return 0;  
  18. }  


      當然, 我們也可以把數字格式化爲字符串, 如下(下面這個程序有問題):

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <string>  
  3. #include <sstream>  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     string str;  
  9.     ostringstream os(str); // 建立關聯, 但實際沒有關聯上啊!!!  
  10.     os << "hello";  
  11.   
  12.     cout << str << endl;  // str居然是空, 怎麼不是"abc"呢? 我不理解  
  13.   
  14.     return 0;  
  15. }  
     看來, 上面的關聯是不成功的, 改爲:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <string>  
  3. #include <sstream>  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     int a = -1;  
  9.     ostringstream os;  
  10.     os << "hello" << a;  
  11.   
  12.     cout << os.str() << endl; // hello-1  
  13.   
  14.     return 0;  
  15. }  

      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章