| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> c/c++ >> C++的iostream標准庫介紹(1)
 

C++的iostream標准庫介紹(1)

2008-06-01 02:04:48  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  我們從一開始就一直在利用C++的輸入輸出在做著各種練習,輸入輸出是由iostream庫提供的,所以討論此標准庫是有必要的,它與C語言的stdio庫不同,它從一開始就是用多重繼續與虛擬繼續實現的面向對象的層次結構,作爲一個c++的標准庫組件提供給程序員使用。

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  iostream爲內置類型類型對象提供了輸入輸出支持,同時也支持文件的輸入輸出,類的設計者可以通過對iostream庫的擴展,來支持自定義類型的輸入輸出操作。爲什麽說要擴展才能提供支持呢?我們來一個示例。#include <stdio.h>

  #include <iostream>

  using namespace std;

  

  class Test

  {

   public:

   Test(int a=0,int b=0)

   {

   Test::a=a;

   Test::b=b;

   }

   int a;

   int b;

  };

  int main()

  {

   Test t(100,50);

   PRintf("%???",t);//不明確的輸出格式

   scanf("%???",t);//不明確的輸入格式

   cout<<t<<endl;//同樣不夠明確

   cin>>t;//同樣不夠明確

   system("pause");

  }由于自定義類的非凡性,在上面的代碼中,無論你使用c風格的輸入輸出,或者是c++的輸入輸出都不是不明確的一個表示,由于c語言沒有運算符重載機制,導致stdio庫的不可擴充性,讓我們無法讓printf()和scanf()支持對自定義類對象的擴充識別,而c++是可以通過運算符重載機制擴充iostream庫的,使系統能能夠識別自定義類型,從而讓輸入輸出明確的知道他們該幹什麽,格式是什麽。

  在上例中我們之所以用printf與cout進行對比目的是爲了告訴大家,C與C++處理輸入輸出的根本不同,我們從c遠的輸入輸出可以很明顯看出是函數調用方式,而c++的則是對象模式,cout和cin是ostream類和istream類的對象。

  C++中的iostream庫主要包含下圖所示的幾個頭文件:
C++的iostream標准庫介紹(1)
我們所熟悉的輸入輸出操作分別是由istream(輸入流)和ostream(輸出流)這兩個類提供的,爲了答應雙向的輸入/輸出,由istream和ostream派生出了iostream類。

  類的繼續關系見下圖:
C++的iostream標准庫介紹(1)


  

C++的iostream標准庫介紹(1)
更多內容請看C/C++技術專題專題,或

  iostream庫定義了以下三個標准流對象:

  1.cin,表示標准輸入(standard input)的istream類對象。cin使我們可以從設備讀如數據。

  2.cout,表示標准輸出(standard output)的ostream類對象。cout使我們可以向設備輸出或者寫數據。

  

   3.cerr,表示標准錯誤(standard error)的osttream類對象。cerr是導出程序錯誤消息的地方,它只能答應向屏幕設備寫數據。

  輸出主要由重載的左移操作符(<<)來完成,輸入主要由重載的右移操作符(>>)完成。

  >>a表示將數據放入a對象中。

  <<a表示將a對象中存儲的數據拿出。

  這些標准的流對象都有默認的所對應的設備,見下表:
C++的iostream標准庫介紹(1)
圖中的意思表明cin對象的默認輸入設備是鍵盤,cout對象的默認輸出設備是顯示器屏幕。

  那麽原理上C++有是如何利用cin/cout對象與左移和右移運算符重載來實現輸入輸出的呢?

  下面我們以輸出爲例,說明其實現原理:

  cout是ostream類的對象,因爲它所指向的是標准設備(顯示器屏幕),所以它在iostream頭文件中作爲全局對象進行定義。

  ostream cout(stdout);//其默認指向的C中的標准設備名,作爲其構造函數的參數使用。

  在iostream.h頭文件中,ostream類對應每個基本數據類型都有其友元函數對左移操作符進行了友元函數的重載。

  ostream& Operator<<(ostream &temp,int source);

  ostream& operator<<(ostream &temp,char *ps);

  。。。。等等

  一句輸出語句:cout<<"www.cndev-lab.com";,事實上調用的就是ostream& operator<<(ostream &temp,char *ps);這個運算符重載函數,由于返回的是流對象的引用,引用可以作爲左值使用,所以當程序中有類似cout<<"www.cndev-lab.com"<<"中國軟件開發實驗室";這樣的語句出現的時候,就能夠構成連續輸出。由于iostream庫不光支持對象的輸入輸出,同時也支持文件流的輸入輸出,所以在具體講解左移與右移運算符重載只前,我們有必要先對文件的輸入輸出以及輸入輸出的控制符有所了解。

  和文件有關系的輸入輸出類主要在fstream.h這個頭文件中被定義,在這個頭文件中主要被定義了三個類,由這三個類控制對文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來,他們之間的繼續關系見下圖所示。
C++的iostream標准庫介紹(1)
由于文件設備並不像顯示器屏幕與鍵盤那樣是標准默認設備,所以它在fstream.h頭文件中是沒有像cout那樣預先定義的全局對象,所以我們必須自己定義一個該類的對象,我們要以文件作爲設備向文件輸出信息(也就是向文件寫數據),那麽就應該使用ofstream類。

  ofstream類的默認構造函數原形爲:

  ofstream::ofstream(const char *filename,int mode = ios::out,int openprot = filebuf::openprot);

  filename:要打開的文件名

  mode:要打開文件的方式

  prot:打開文件的屬性

  其中mode和openprot這兩個參數的可選項表見下表:

  mode屬性表

  ios::app:以追加的方式打開文件

  ios::ate:文件打開後定位到文件尾,ios:app就包含有此屬性

  ios::binary: 以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區別見前文

  ios::in: 文件以輸入方式打開

  ios::out:文件以輸出方式打開

  ios::trunc:假如文件存在,把文件長度設爲0

  可以用「或」把以上屬性連接起來,如ios::outios::binary。

  openprot屬性表:

  0:普通文件,打開訪問

  1:只讀文件

  2:隱含文件

  4:系統文件

  可以用「或」或者「+」把以上屬性連接起來 ,如3或12就是以只讀和隱含屬性打開文件。

  

C++的iostream標准庫介紹(1)
更多內容請看C/C++技術專題專題,或

  示例代碼如下://程序作者:管甯

  //站點:www.cndev-lab.com

  //所有稿件均有版權,如要轉載,請務必聞名出處和作者

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

   #include <fstream>

  using namespace std;

  

  int main()

  {

   ofstream myfile("c:\\1.txt",ios::outios::trunc,0);

   myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com";

   myfile.close()

   system("pause");

  }文件使用完後可以使用close成員函數關閉文件。

  ios::app爲追加模式,在使用追加模式的時候同時進行文件狀態的判定是一個比較好的習慣。

  示例如下://程序作者:管甯

  //站點:www.cndev-lab.com

  //所有稿件均有版權,如要轉載,請務必聞名出處和作者

  #include <iostream>

  #include <fstream>

  using namespace std;

  int main()

  {

   ofstream myfile("c:\\1.txt",ios::app,0);

   if(!myfile)//或者寫成myfile.fail()

   {

   cout<<"文件打開失敗,目標文件狀態可能爲只讀!";

   system("pause");

   exit(1);

   }

   myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"<<endl;

   myfile.close();

  }在定義ifstream和ofstream類對象的時候,我們也可以不指定文件。以後可以通過成員函數open()顯式的把一個文件連接到一個類對象上。

  例如://程序作者:管甯

  //站點:www.cndev-lab.com

  //所有稿件均有版權,如要轉載,請務必聞名出處和作者

  #include <iostream>

  #include <fstream>

  using namespace std;

  int main()

  {

   ofstream myfile;

   myfile.open("c:\\1.txt",ios::outios::app,0);

   if(!myfile)//或者寫成myfile.fail()

   {

   cout<<"文件創建失敗,磁盤不可寫或者文件爲只讀!";

   system("pause");

   exit(1);

   }

   myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"<<endl;

   myfile.close();

  }下面我們來看一下是如何利用ifstream類對象,將文件中的數據讀取出來,然後再輸出到標准設備中的例子。

  代碼如下://程序作者:管甯

  //站點:www.cndev-lab.com

  //所有稿件均有版權,如要轉載,請務必聞名出處和作者

  #include <iostream>

  #include <fstream>

  #include <string>

  using namespace std;

  int main()

  {

   ifstream myfile;

  

   myfile.open("c:\\1.txt",ios::in,0);

   if(!myfile)

   {

   cout<<"文件讀錯誤";

   system("pause");

   exit(1);

   }

   char ch;

   string content;

   while(myfile.get(ch))

   {

   content+=ch;

   cout.put(ch);//cout<<ch;這麽寫也是可以的

   }

   myfile.close();

   cout<<content;

   system("pause");

  }上例中,我們利用成員函數get(),逐一的讀取文件中的有效字符,再利用put()成員函數,將文件中的數據通過循環逐一輸出到標准設備(屏幕)上,get()成員函數會在文件讀到默尾的時候返回假值,所以我們可以利用它的這個特性作爲while循環的終止條件,我們同時也在上例中引入了C++風格的字符串類型string,在循環讀取的時候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。

  

C++的iostream標准庫介紹(1)
更多內容請看C/C++技術專題專題,或

  我們在簡單介紹過ofstream類和ifstream類後,我們再來看一下fstream類,fstream類是由iostream派生而來,fstream類對象可以同對文件進行讀寫操作。示例代碼如下:

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  //程序作者:管甯

  //站點:www.cndev-lab.com

  //所有稿件均有版權,如要轉載,請務必聞名出處和作者

  #include <iostream>

  #include <fstream>

  using namespace std;

  int main()

  {

   fstream myfile;

   myfile.open("c:\\1.txt",ios::outios::app,0);

   if(!myfile)

   {

   cout<<"文件寫錯誤,文件屬性可能爲只讀!"<<endl;

   system("pause");

   exit(1);

   }

   myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"<<endl;

   myfile.close();

  

   myfile.open("c:\\1.txt",ios::in,0);

   if(!myfile)

   {

   cout<<"文件讀錯誤,文件可能丟失!"<<endl;

  

   system("pause");

   exit(1);

   }

   char ch;

   while(myfile.get(ch))

   {

   cout.put(ch);

   }

   myfile.close();

   system("pause");

  }由于fstream類可以對文件同時進行讀寫操作,所以對它的對象進行初始話的時候一定要顯式的指定mode和openprot參數。接下來我們來學習一下串流類的基礎知識,什麽叫串流類?

  簡單的理解就是能夠控制字符串類型對象進行輸入輸出的類,C++不光可以支持C++風格的字符串流控制,還可以支持C風格的字符串流控制。

  我們先看看看C++是如何對C風格的字符串流進行控制的,C中的字符串其實也就是字符數組,字符數組內的數據在內存中的位置的排列是連續的,我們通常用char str[size]或者char *str的方式聲明創建C風格字符數組,爲了能讓字符數組作爲設備並提供輸入輸出操作,C++引入了ostrstream、istrstream、strstream這三個類,要使用他們創建對象就必須包含strstream.h頭文件。

  istrstream類用于執行C風格的串流的輸入操作,也就是以字符串數組作爲輸入設備。

  ostrstream類用于執行C風格的串流的輸出操作,也就是一字符串數組作爲輸出設備。

  strstream類同時可以支持C風格的串流的輸入輸出操作。

  istrstream類是從istream(輸入流類)和strstreambase(字符串流基類)派生而來,ostrstream是從ostream(輸出流類)和strstreambase(字符串流基類)派生而來,strstream則是從iostream(輸入輸出流類)和和strstreambase(字符串流基類)派生而來。

  他們的繼續關系如下圖所示:
C++的iostream標准庫介紹(1)
串流同樣不是標准設備,不會有預先定義好的全局對象,所以不能直接操作,需要通過構造函數創建對象。

  

C++的iostream標准庫介紹(1)
更多內容請看C/C++技術專題專題,或

  類istrstream的構造函數原形如下:

  istrstream::istrstream(const char *str,int size);

  參數1表示字符串數組,而參數2表示數組大小,當size爲0時,表示istrstream類對象直接連接到由str所指向的內存空間並以\0結尾的字符串。

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  下面的示例代碼就是利用istrstream類創建類對象,制定流輸入設備爲字符串數組,通過它向一個字符型對象輸入數據。

  代碼如下://程序作者:管甯

  //站點:www.cndev-lab.com

  //所有稿件均有版權,如要轉載,請務必聞名出處和作者

  #include <iostream>

  #include <strstream>

  using namespace std;

  int main()

  {

   char *name = "www.cndev-lab.com";

   int arraysize = strlen(name)+1;

   istrstream is(name,arraysize);

   char temp;

   is>>temp;

   cout<<temp;

   system("pause");

  }類ostrstream用于執行串流的輸出,它的構造函數如下所示:

  

  

  ostrstream::ostrstream(char *_Ptr,int streamsize,int Mode = ios::out);

  第一個參數是字符數組,第二個是說明數組的大小,第三個參數是指打開方式。

  我們來一個示例代碼:#include <iostream>

  #include <strstream>

  using namespace std;

  int main()

  {

   int arraysize=1;

   char *pbuffer=new char[arraysize];

   ostrstream ostr(pbuffer,arraysize,ios::out);

   ostr<<arraysize<<ends;//使用ostrstream輸出到流對象的時候,要用ends結束字符串

   cout<<pbuffer;

   delete[] pbuffer;

   system("pause");

  }上面的代碼中,我們創建一個c風格的串流輸出對象ostr,我們將arraysize內的數據成功的以字符串的形式輸出到了ostr對象所指向的pbuffer指針的堆空間中,pbuffer也正是我們要輸出的字符串數組,在結尾要使用ends結束字符串,假如不這麽做就有溢出的危險。
C++的iostream標准庫介紹(1)
更多內容請看C/C++技術專題專題,或
 
 
 
上一篇《C++運算符重載賦值運算符》
下一篇《如何用C++編程獲得某台機器的IP地址》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
  我們從一開始就一直在利用C++的輸入輸出在做著各種練習,輸入輸出是由iostream庫提供的,所以討論此標准庫是有必要的,它與C語言的stdio庫不同,它從一開始就是用多重繼續與虛擬繼續實現的面向對象的層次結構,作爲一個c++的標准庫組件提供給程序員使用。   iostream爲內置類型類型對象提供了輸入輸出支持,同時也支持文件的輸入輸出,類的設計者可以通過對iostream庫的擴展,來支持自定義類型的輸入輸出操作。  爲什麽說要擴展才能提供支持呢?我們來一個示例。#include <stdio.h> #include <iostream> using namespace std; class Test { public: Test(int a=0,int b=0) { Test::a=a; Test::b=b; } int a; int b; }; int main() { Test t(100,50); PRintf("%???",t);//不明確的輸出格式 scanf("%???",t);//不明確的輸入格式 cout<<t<<endl;//同樣不夠明確 cin>>t;//同樣不夠明確 system("pause"); }  由于自定義類的非凡性,在上面的代碼中,無論你使用c風格的輸入輸出,或者是c++的輸入輸出都不是不明確的一個表示,由于c語言沒有運算符重載機制,導致stdio庫的不可擴充性,讓我們無法讓printf()和scanf()支持對自定義類對象的擴充識別,而c++是可以通過運算符重載機制擴充iostream庫的,使系統能能夠識別自定義類型,從而讓輸入輸出明確的知道他們該幹什麽,格式是什麽。   在上例中我們之所以用printf與cout進行對比目的是爲了告訴大家,C與C++處理輸入輸出的根本不同,我們從c遠的輸入輸出可以很明顯看出是函數調用方式,而c++的則是對象模式,cout和cin是ostream類和istream類的對象。   C++中的iostream庫主要包含下圖所示的幾個頭文件:[url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894532.gif[/img][/url]  我們所熟悉的輸入輸出操作分別是由istream(輸入流)和ostream(輸出流)這兩個類提供的,爲了答應雙向的輸入/輸出,由istream和ostream派生出了iostream類。   類的繼續關系見下圖:[url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894581.gif[/img][/url] [url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894606.gif[/img][/url] 更多內容請看C/C++技術專題專題,或 iostream庫定義了以下三個標准流對象:   1.cin,表示標准輸入(standard input)的istream類對象。cin使我們可以從設備讀如數據。   2.cout,表示標准輸出(standard output)的ostream類對象。cout使我們可以向設備輸出或者寫數據。   3.cerr,表示標准錯誤(standard error)的osttream類對象。cerr是導出程序錯誤消息的地方,它只能答應向屏幕設備寫數據。   輸出主要由重載的左移操作符(<<)來完成,輸入主要由重載的右移操作符(>>)完成。   >>a表示將數據放入a對象中。   <<a表示將a對象中存儲的數據拿出。   這些標准的流對象都有默認的所對應的設備,見下表:[url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894647.gif[/img][/url]  圖中的意思表明cin對象的默認輸入設備是鍵盤,cout對象的默認輸出設備是顯示器屏幕。   那麽原理上C++有是如何利用cin/cout對象與左移和右移運算符重載來實現輸入輸出的呢?   下面我們以輸出爲例,說明其實現原理:   cout是ostream類的對象,因爲它所指向的是標准設備(顯示器屏幕),所以它在iostream頭文件中作爲全局對象進行定義。   ostream cout(stdout);//其默認指向的C中的標准設備名,作爲其構造函數的參數使用。   在iostream.h頭文件中,ostream類對應每個基本數據類型都有其友元函數對左移操作符進行了友元函數的重載。   ostream& Operator<<(ostream &temp,int source);   ostream& operator<<(ostream &temp,char *ps);   。。。。等等   一句輸出語句:cout<<"www.cndev-lab.com";,事實上調用的就是ostream& operator<<(ostream &temp,char *ps);這個運算符重載函數,由于返回的是流對象的引用,引用可以作爲左值使用,所以當程序中有類似cout<<"www.cndev-lab.com"<<"中國軟件開發實驗室";這樣的語句出現的時候,就能夠構成連續輸出。  由于iostream庫不光支持對象的輸入輸出,同時也支持文件流的輸入輸出,所以在具體講解左移與右移運算符重載只前,我們有必要先對文件的輸入輸出以及輸入輸出的控制符有所了解。   和文件有關系的輸入輸出類主要在fstream.h這個頭文件中被定義,在這個頭文件中主要被定義了三個類,由這三個類控制對文件的各種輸入輸出操作,他們分別是ifstream、ofstream、fstream,其中fstream類是由iostream類派生而來,他們之間的繼續關系見下圖所示。[url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894712.gif[/img][/url]  由于文件設備並不像顯示器屏幕與鍵盤那樣是標准默認設備,所以它在fstream.h頭文件中是沒有像cout那樣預先定義的全局對象,所以我們必須自己定義一個該類的對象,我們要以文件作爲設備向文件輸出信息(也就是向文件寫數據),那麽就應該使用ofstream類。   ofstream類的默認構造函數原形爲:   ofstream::ofstream(const char *filename,int mode = ios::out,int openprot = filebuf::openprot);   filename:  要打開的文件名   mode:    要打開文件的方式   prot:    打開文件的屬性   其中mode和openprot這兩個參數的可選項表見下表: mode屬性表   ios::app:   以追加的方式打開文件   ios::ate:   文件打開後定位到文件尾,ios:app就包含有此屬性   ios::binary:  以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區別見前文   ios::in:    文件以輸入方式打開   ios::out:   文件以輸出方式打開   ios::trunc:  假如文件存在,把文件長度設爲0   可以用「或」把以上屬性連接起來,如ios::outios::binary。 openprot屬性表:   0:普通文件,打開訪問   1:只讀文件   2:隱含文件   4:系統文件   可以用「或」或者「+」把以上屬性連接起來 ,如3或12就是以只讀和隱含屬性打開文件。 [url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894775.gif[/img][/url] 更多內容請看C/C++技術專題專題,或   示例代碼如下://程序作者:管甯 //站點:www.cndev-lab.com //所有稿件均有版權,如要轉載,請務必聞名出處和作者 #include <fstream> using namespace std; int main() { ofstream myfile("c:\\1.txt",ios::outios::trunc,0); myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"; myfile.close() system("pause"); }  文件使用完後可以使用close成員函數關閉文件。   ios::app爲追加模式,在使用追加模式的時候同時進行文件狀態的判定是一個比較好的習慣。   示例如下://程序作者:管甯 //站點:www.cndev-lab.com //所有稿件均有版權,如要轉載,請務必聞名出處和作者 #include <iostream> #include <fstream> using namespace std; int main() { ofstream myfile("c:\\1.txt",ios::app,0); if(!myfile)//或者寫成myfile.fail() { cout<<"文件打開失敗,目標文件狀態可能爲只讀!"; system("pause"); exit(1); } myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"<<endl; myfile.close(); }  在定義ifstream和ofstream類對象的時候,我們也可以不指定文件。以後可以通過成員函數open()顯式的把一個文件連接到一個類對象上。   例如://程序作者:管甯 //站點:www.cndev-lab.com //所有稿件均有版權,如要轉載,請務必聞名出處和作者 #include <iostream> #include <fstream> using namespace std; int main() { ofstream myfile; myfile.open("c:\\1.txt",ios::outios::app,0); if(!myfile)//或者寫成myfile.fail() { cout<<"文件創建失敗,磁盤不可寫或者文件爲只讀!"; system("pause"); exit(1); } myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"<<endl; myfile.close(); }  下面我們來看一下是如何利用ifstream類對象,將文件中的數據讀取出來,然後再輸出到標准設備中的例子。   代碼如下://程序作者:管甯 //站點:www.cndev-lab.com //所有稿件均有版權,如要轉載,請務必聞名出處和作者 #include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream myfile; myfile.open("c:\\1.txt",ios::in,0); if(!myfile) { cout<<"文件讀錯誤"; system("pause"); exit(1); } char ch; string content; while(myfile.get(ch)) { content+=ch; cout.put(ch);//cout<<ch;這麽寫也是可以的 } myfile.close(); cout<<content; system("pause"); }  上例中,我們利用成員函數get(),逐一的讀取文件中的有效字符,再利用put()成員函數,將文件中的數據通過循環逐一輸出到標准設備(屏幕)上,get()成員函數會在文件讀到默尾的時候返回假值,所以我們可以利用它的這個特性作爲while循環的終止條件,我們同時也在上例中引入了C++風格的字符串類型string,在循環讀取的時候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。 [url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894812.gif[/img][/url] 更多內容請看C/C++技術專題專題,或   我們在簡單介紹過ofstream類和ifstream類後,我們再來看一下fstream類,fstream類是由iostream派生而來,fstream類對象可以同對文件進行讀寫操作。  示例代碼如下: //程序作者:管甯 //站點:www.cndev-lab.com //所有稿件均有版權,如要轉載,請務必聞名出處和作者 #include <iostream> #include <fstream> using namespace std; int main() { fstream myfile; myfile.open("c:\\1.txt",ios::outios::app,0); if(!myfile) { cout<<"文件寫錯誤,文件屬性可能爲只讀!"<<endl; system("pause"); exit(1); } myfile<<"中國軟件開發實驗室"<<endl<<"網址:"<<"www.cndev-lab.com"<<endl; myfile.close(); myfile.open("c:\\1.txt",ios::in,0); if(!myfile) { cout<<"文件讀錯誤,文件可能丟失!"<<endl; system("pause"); exit(1); } char ch; while(myfile.get(ch)) { cout.put(ch); } myfile.close(); system("pause"); }  由于fstream類可以對文件同時進行讀寫操作,所以對它的對象進行初始話的時候一定要顯式的指定mode和openprot參數。  接下來我們來學習一下串流類的基礎知識,什麽叫串流類?   簡單的理解就是能夠控制字符串類型對象進行輸入輸出的類,C++不光可以支持C++風格的字符串流控制,還可以支持C風格的字符串流控制。   我們先看看看C++是如何對C風格的字符串流進行控制的,C中的字符串其實也就是字符數組,字符數組內的數據在內存中的位置的排列是連續的,我們通常用char str[size]或者char *str的方式聲明創建C風格字符數組,爲了能讓字符數組作爲設備並提供輸入輸出操作,C++引入了ostrstream、istrstream、strstream這三個類,要使用他們創建對象就必須包含strstream.h頭文件。   istrstream類用于執行C風格的串流的輸入操作,也就是以字符串數組作爲輸入設備。   ostrstream類用于執行C風格的串流的輸出操作,也就是一字符串數組作爲輸出設備。   strstream類同時可以支持C風格的串流的輸入輸出操作。   istrstream類是從istream(輸入流類)和strstreambase(字符串流基類)派生而來,ostrstream是從ostream(輸出流類)和strstreambase(字符串流基類)派生而來,strstream則是從iostream(輸入輸出流類)和和strstreambase(字符串流基類)派生而來。   他們的繼續關系如下圖所示:[url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894840.gif[/img][/url]  串流同樣不是標准設備,不會有預先定義好的全局對象,所以不能直接操作,需要通過構造函數創建對象。 [url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894876.gif[/img][/url] 更多內容請看C/C++技術專題專題,或   類istrstream的構造函數原形如下:   istrstream::istrstream(const char *str,int size);   參數1表示字符串數組,而參數2表示數組大小,當size爲0時,表示istrstream類對象直接連接到由str所指向的內存空間並以\0結尾的字符串。   下面的示例代碼就是利用istrstream類創建類對象,制定流輸入設備爲字符串數組,通過它向一個字符型對象輸入數據。   代碼如下://程序作者:管甯 //站點:www.cndev-lab.com //所有稿件均有版權,如要轉載,請務必聞名出處和作者 #include <iostream> #include <strstream> using namespace std; int main() { char *name = "www.cndev-lab.com"; int arraysize = strlen(name)+1; istrstream is(name,arraysize); char temp; is>>temp; cout<<temp; system("pause"); }  類ostrstream用于執行串流的輸出,它的構造函數如下所示:   ostrstream::ostrstream(char *_Ptr,int streamsize,int Mode = ios::out);   第一個參數是字符數組,第二個是說明數組的大小,第三個參數是指打開方式。   我們來一個示例代碼:#include <iostream> #include <strstream> using namespace std; int main() { int arraysize=1; char *pbuffer=new char[arraysize]; ostrstream ostr(pbuffer,arraysize,ios::out); ostr<<arraysize<<ends;//使用ostrstream輸出到流對象的時候,要用ends結束字符串 cout<<pbuffer; delete[] pbuffer; system("pause"); }  上面的代碼中,我們創建一個c風格的串流輸出對象ostr,我們將arraysize內的數據成功的以字符串的形式輸出到了ostr對象所指向的pbuffer指針的堆空間中,pbuffer也正是我們要輸出的字符串數組,在結尾要使用ends結束字符串,假如不這麽做就有溢出的危險。 [url=/bbs/detail_1785321.html][img]http://image.wangchao.net.cn/it/1323423894885.gif[/img][/url] 更多內容請看C/C++技術專題專題,或
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
陽光靓麗的模特兒(8)
陽光靓麗的模特兒(7)
陽光靓麗的模特兒(6)
陽光靓麗的模特兒(5)
秋-印象
德慶盤龍峽 一
松江印象之三
雲之南(寬幅)
 
>>返回首頁<<
 
 
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有