国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

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

2019-11-17 05:03:44
字體:
供稿:網(wǎng)友
  我們從一開始就一直在利用C++的輸入輸出在做著各種練習,輸入輸出是由iostream庫提供的,所以討論此標準庫是有必要的,它與C語言的stdio庫不同,它從一開始就是用多重繼續(xù)與虛擬繼續(xù)實現(xiàn)的面向?qū)ο蟮膶哟谓Y(jié)構(gòu),作為一個c++的標準庫組件提供給程序員使用。
  iostream為內(nèi)置類型類型對象提供了輸入輸出支持,同時也支持文件的輸入輸出,類的設(shè)計者可以通過對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); 
        scanf("%???",t);//不明確的輸入格式 
    cout<<t<<endl;//同樣不夠明確 
    cin>>t;//同樣不夠明確 
    system("pause"); 
}  由于自定義類的非凡性,在上面的代碼中,無論你使用c風格的輸入輸出,或者是c++的輸入輸出都不是不明確的一個表示,由于c語言沒有運算符重載機制,導(dǎo)致stdio庫的不可擴充性,讓我們無法讓printf()和scanf()支持對自定義類對象的擴充識別,而c++是可以通過運算符重載機制擴充iostream庫的,使系統(tǒng)能能夠識別自定義類型,從而讓輸入輸出明確的知道他們該干什么,格式是什么。

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

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

  類的繼續(xù)關(guān)系見下圖:C++的iostream標準庫介紹(1) 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或
iostream庫定義了以下三個標準流對象:

  1.cin,表示標準輸入(standard input)的istream類對象。cin使我們可以從設(shè)備讀如數(shù)據(jù)。
  2.cout,表示標準輸出(standard output)的ostream類對象。cout使我們可以向設(shè)備輸出或者寫數(shù)據(jù)。

  3.cerr,表示標準錯誤(standard error)的osttream類對象。cerr是導(dǎo)出程序錯誤消息的地方,它只能答應(yīng)向屏幕設(shè)備寫數(shù)據(jù)。

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

  >>a表示將數(shù)據(jù)放入a對象中。
  <<a表示將a對象中存儲的數(shù)據(jù)拿出。

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

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

  下面我們以輸出為例,說明其實現(xiàn)原理:

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

  ostream cout(stdout);//其默認指向的C中的標準設(shè)備名,作為其構(gòu)造函數(shù)的參數(shù)使用。

  在iostream.h頭文件中,ostream類對應(yīng)每個基本數(shù)據(jù)類型都有其友元函數(shù)對左移操作符進行了友元函數(shù)的重載。
  ostream&
Operator<<(ostream &temp,int source);
  ostream& operator<<(ostream &temp,char *ps);
  。。。。等等

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

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

  ofstream類的默認構(gòu)造函數(shù)原形為:

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

  filename:  要打開的文件名
  mode:    要打開文件的方式
  prot:    打開文件的屬性

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

mode屬性表

  ios::app:   以追加的方式打開文件
  ios::ate:   文件打開后定位到文件尾,ios:app就包含有此屬性
  ios::binary:  以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區(qū)別見前文
  ios::in:    文件以輸入方式打開
  ios::out:   文件以輸出方式打開
  ios::trunc:  假如文件存在,把文件長度設(shè)為0

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

openprot屬性表:

  0:普通文件,打開訪問
  1:只讀文件
  2:隱含文件
  4:系統(tǒng)文件

  可以用“或”或者“+”把以上屬性連接起來 ,如3或12就是以只讀和隱含屬性打開文件。 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或  

  示例代碼如下://程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者 
 

#include <fstream> 
using namespace std; 
 
int main()  

    ofstream myfile("c://1.txt",ios::outios::trunc,0); 
    myfile<<"中國軟件開發(fā)實驗室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com"; 
    myfile.close() 
    system("pause"); 
}  文件使用完后可以使用close成員函數(shù)關(guān)閉文件。

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

  示例如下://程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者 
#include <iostream> 
#include <fstream> 
using namespace std; 
int main()  

    ofstream myfile("c://1.txt",ios::app,0); 
    if(!myfile)//或者寫成myfile.fail() 
    { 
        cout<<"文件打開失敗,目標文件狀態(tài)可能為只讀!"; 
        system("pause"); 
        exit(1); 
    } 
    myfile<<"中國軟件開發(fā)實驗室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com"<<endl; 
    myfile.close(); 
}  在定義ifstream和ofstream類對象的時候,我們也可以不指定文件。以后可以通過成員函數(shù)open()顯式的把一個文件連接到一個類對象上。

  例如://程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者 
#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<<"文件創(chuàng)建失敗,磁盤不可寫或者文件為只讀!"; 
        system("pause"); 
        exit(1); 
    } 
    myfile<<"中國軟件開發(fā)實驗室"<<endl<<"網(wǎng)址:"<<"www.cndev-lab.com"<<endl; 
    myfile.close(); 
}  下面我們來看一下是如何利用ifstream類對象,將文件中的數(shù)據(jù)讀取出來,然后再輸出到標準設(shè)備中的例子。

  代碼如下://程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者 
#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"); 
}  上例中,我們利用成員函數(shù)get(),逐一的讀取文件中的有效字符,再利用put()成員函數(shù),將文件中的數(shù)據(jù)通過循環(huán)逐一輸出到標準設(shè)備(屏幕)上,get()成員函數(shù)會在文件讀到默尾的時候返回假值,所以我們可以利用它的這個特性作為while循環(huán)的終止條件,我們同時也在上例中引入了C++風格的字符串類型string,在循環(huán)讀取的時候逐一保存到content中,要使用string類型,必須包含string.h的頭文件。 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或   我們在簡單介紹過ofstream類和ifstream類后,我們再來看一下fstream類,fstream類是由iostream派生而來,fstream類對象可以同對文件進行讀寫操作。  示例代碼如下:
//程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者 
#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<<"中國軟件開發(fā)實驗室"<<endl<<"網(wǎng)址:"<<"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參數(shù)。  接下來我們來學習一下串流類的基礎(chǔ)知識,什么叫串流類?
  簡單的理解就是能夠控制字符串類型對象進行輸入輸出的類,C++不光可以支持C++風格的字符串流控制,還可以支持C風格的字符串流控制。

  我們先看看看C++是如何對C風格的字符串流進行控制的,C中的字符串其實也就是字符數(shù)組,字符數(shù)組內(nèi)的數(shù)據(jù)在內(nèi)存中的位置的排列是連續(xù)的,我們通常用char str[size]或者char *str的方式聲明創(chuàng)建C風格字符數(shù)組,為了能讓字符數(shù)組作為設(shè)備并提供輸入輸出操作,C++引入了ostrstream、istrstream、strstream這三個類,要使用他們創(chuàng)建對象就必須包含strstream.h頭文件。
  istrstream類用于執(zhí)行C風格的串流的輸入操作,也就是以字符串數(shù)組作為輸入設(shè)備。
  ostrstream類用于執(zhí)行C風格的串流的輸出操作,也就是一字符串數(shù)組作為輸出設(shè)備。
  strstream類同時可以支持C風格的串流的輸入輸出操作。

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

  他們的繼續(xù)關(guān)系如下圖所示:C++的iostream標準庫介紹(1)  串流同樣不是標準設(shè)備,不會有預(yù)先定義好的全局對象,所以不能直接操作,需要通過構(gòu)造函數(shù)創(chuàng)建對象。 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或

  類istrstream的構(gòu)造函數(shù)原形如下:
  istrstream::istrstream(const char *str,int size);
  參數(shù)1表示字符串數(shù)組,而參數(shù)2表示數(shù)組大小,當size為0時,表示istrstream類對象直接連接到由str所指向的內(nèi)存空間并以/0結(jié)尾的字符串。

  下面的示例代碼就是利用istrstream類創(chuàng)建類對象,制定流輸入設(shè)備為字符串數(shù)組,通過它向一個字符型對象輸入數(shù)據(jù)。

  代碼如下://程序作者:管寧 
//站點:www.cndev-lab.com 
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請務(wù)必聞名出處和作者 
#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用于執(zhí)行串流的輸出,它的構(gòu)造函數(shù)如下所示:


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

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

  我們來一個示例代碼:#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結(jié)束字符串 
    cout<<pbuffer; 
    delete[] pbuffer; 
    system("pause"); 
}  上面的代碼中,我們創(chuàng)建一個c風格的串流輸出對象ostr,我們將arraysize內(nèi)的數(shù)據(jù)成功的以字符串的形式輸出到了ostr對象所指向的pbuffer指針的堆空間中,pbuffer也正是我們要輸出的字符串數(shù)組,在結(jié)尾要使用ends結(jié)束字符串,假如不這么做就有溢出的危險。 更多文章 更多內(nèi)容請看C/C++技術(shù)專題專題,或

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉沽区| 玉龙| 英超| 鄂温| 通城县| 西乌珠穆沁旗| 台山市| 时尚| 荥阳市| 德令哈市| 醴陵市| 吉水县| 延川县| 瓦房店市| 灵川县| 宁远县| 扎囊县| 汝城县| 工布江达县| 温州市| 克东县| 扎赉特旗| 新余市| 哈尔滨市| 伊通| 启东市| 敦煌市| 汝南县| 合阳县| 藁城市| 启东市| 德保县| 铜川市| 彭阳县| 尼勒克县| 鄂托克旗| 明溪县| 德化县| 闵行区| 漯河市| 茶陵县|