欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++的sstream標(biāo)準(zhǔn)庫詳細(xì)介紹

 更新時間:2013年09月10日 09:08:30   作者:  
以下是對C++中的的sstream標(biāo)準(zhǔn)庫進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下

C++的sstream標(biāo)準(zhǔn)庫介紹
接下來我們繼續(xù)看一下C++風(fēng)格的串流控制 ,C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們創(chuàng)建對象就必須包含sstream.h頭文件。

istringstream類用于執(zhí)行C++風(fēng)格的串流的輸入操作。
ostringstream類用于執(zhí)行C風(fēng)格的串流的輸出操作。
strstream類同時可以支持C風(fēng)格的串流的輸入輸出操作。

istringstream類是從istream(輸入流類)和stringstreambase(c++字符串流基類)派生而來,ostringstream是從ostream(輸出流類)和stringstreambase(c++字符串流基類)派生而來,stringstream則是從iostream(輸入輸出流類)和和stringstreambase(c++字符串流基類)派生而來。

他們的繼承關(guān)系如下圖所示:

istringstream是由一個string對象構(gòu)造而來,istringstream類從一個string對象讀取字符。

istringstream的構(gòu)造函數(shù)原形如下:
istringstream::istringstream(string str);

復(fù)制代碼 代碼如下:

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

istringstream istr; 
istr.str("1 56.7",); 
//上述兩個過程可以簡單寫成 istringstream istr("1 56.7"); 
cout  << istr.str()<<endl; 
int  a; 
float  b; 
istr>>a; 
cout <<a<<endl; 
istr>>b; 
cout <<b<<endl; 
system("pause"); 
}

上例中,構(gòu)造字符串流的時候,空格會成為字符串參數(shù)的內(nèi)部分界,例子中對a,b對象的輸入"賦值"操作證明了這一點(diǎn),字符串的空格成為了整型數(shù)據(jù)與浮點(diǎn)型數(shù)據(jù)的分解點(diǎn),利用分界獲取的方法我們事實上完成了字符串到整型對象與浮點(diǎn)型對象的拆分轉(zhuǎn)換過程。

str()成員函數(shù)的使用可以讓istringstream對象返回一個string字符串(例如本例中的輸出操作(cout<<istr.str();)。

ostringstream同樣是由一個string對象構(gòu)造而來,ostringstream類向一個string插入字符。

ostringstream的構(gòu)造函數(shù)原形如下:
ostringstream::ostringstream(string str);

示例代碼如下:

復(fù)制代碼 代碼如下:

#include <iostream > 
#include <sstream > 
#include <string > 
using  namespace  std; 
int  main ()  

ostringstream ostr; 
//ostr.str("abc");//如果構(gòu)造的時候設(shè)置了字符串參數(shù),那么增長操作的時候不會從結(jié)尾開始增加,而是修改原有數(shù)據(jù),超出的部分增長 
ostr.put('d'); 
ostr.put('e'); 
ostr<<"fg"; 

string  gstr =  ostr.str(); 
cout <<gstr; 
system("pause"); 
}

在上例代碼中,我們通過put()或者左移操作符可以不斷向ostr插入單個字符或者是字符串,通過str()函數(shù)返回增長過后的完整字符串?dāng)?shù)據(jù),但值得注意的一點(diǎn)是,當(dāng)構(gòu)造的時候?qū)ο髢?nèi)已經(jīng)存在字符串?dāng)?shù)據(jù)的時候,那么增長操作的時候不會從結(jié)尾開始增加,而是修改原有數(shù)據(jù),超出的部分增長。

對于stringstream了來說,不用我多說,大家也已經(jīng)知道它是用于C++風(fēng)格的字符串的輸入輸出的。

stringstream的構(gòu)造函數(shù)原形如下:
stringstream::stringstream(string str);

示例代碼如下:

復(fù)制代碼 代碼如下:

#include <iostream > 
#include <sstream > 
#include <string > 
using  namespace  std; 

int  main ()  

    stringstream ostr("ccc"); 
    ostr.put('d'); 
    ostr.put('e'); 
    ostr<<"fg"; 
    string  gstr =  ostr.str(); 
    cout <<gstr<<endl; 

    char  a; 
    ostr>>a; 
    cout <<a 

    system("pause"); 
}

除此而外,stringstream類的對象我們還常用它進(jìn)行string與各種內(nèi)置類型數(shù)據(jù)之間的轉(zhuǎn)換。

示例代碼如下:

復(fù)制代碼 代碼如下:

#include <iostream > 
#include <sstream > 
#include <string > 
using  namespace  std; 

int  main ()  

    stringstream sstr; 
//--------int轉(zhuǎn)string----------- 
    int  a=100; 
    string  str; 
    sstr<<a; 
    sstr>>str; 
    cout <<str<<endl; 
//--------string轉(zhuǎn)char[]-------- 
    sstr.clear();//如果你想通過使用同一stringstream對象實現(xiàn)多種類型的轉(zhuǎn)換,請注意在每一次轉(zhuǎn)換之后都必須調(diào)用clear()成員函數(shù)。 
    string  name =  "colinguan"; 
    char  cname[200]; 
    sstr<<name; 
    sstr>>cname; 
    cout <<cname; 
    system("pause"); 
}

接下來我們來學(xué)習(xí)一下輸入/輸出的狀態(tài)標(biāo)志 的相關(guān)知識,C++中負(fù)責(zé)的輸入/輸出的系統(tǒng)包括了關(guān)于每一個輸入/輸出操作的結(jié)果的記錄信息。這些當(dāng)前的狀態(tài)信息被包含在io_state類型的對象中。io_state是一個枚舉類型(就像open_mode一樣),以下便是它包含的值。

goodbit 無錯誤
Eofbit 已到達(dá)文件尾
failbit 非致命的輸入/輸出錯誤,可挽回
badbit 致命的輸入/輸出錯誤,無法挽回

有兩種方法可以獲得輸入/輸出的狀態(tài)信息。一種方法是通過調(diào)用rdstate()函數(shù),它將返回當(dāng)前狀態(tài)的錯誤標(biāo)記。例如,假如沒有任何錯誤,則rdstate()會返回goodbit.

下例示例,表示出了rdstate()的用法:

復(fù)制代碼 代碼如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    cin >>a; 
    cout <<cin .rdstate()<<endl; 
    if (cin .rdstate() == ios ::goodbit) 
    { 
        cout <<"輸入數(shù)據(jù)的類型正確,無錯誤!"<<endl; 
    } 
    if (cin .rdstate() == ios_base::failbit) 
    { 
        cout <<"輸入數(shù)據(jù)類型錯誤,非致命錯誤,可清除輸入緩沖區(qū)挽回!"<<endl; 
    } 
    system("pause"); 
}

另一種方法則是使用下面任何一個函數(shù)來檢測相應(yīng)的輸入/輸出狀態(tài):

bool bad();
bool eof();
bool fail();
bool good();

下例示例,表示出了上面各成員函數(shù)的用法:

復(fù)制代碼 代碼如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    cin >>a; 
    cout <<cin .rdstate()<<endl; 
    if (cin .good()) 
    { 
        cout <<"輸入數(shù)據(jù)的類型正確,無錯誤!"<<endl; 
    } 
    if (cin .fail()) 
    { 
        cout <<"輸入數(shù)據(jù)類型錯誤,非致命錯誤,可清除輸入緩沖區(qū)挽回!"<<endl; 
    } 
    system("pause"); 
}

如果錯誤發(fā)生,那么流狀態(tài)既被標(biāo)記為錯誤,你必須清除這些錯誤狀態(tài),以使你的程序能正確適當(dāng)?shù)乩^續(xù)運(yùn)行。要清除錯誤狀態(tài),需使用clear()函數(shù)。此函數(shù)帶一個參數(shù),它是你將要設(shè)為當(dāng)前狀態(tài)的標(biāo)志值。,只要將ios::goodbit作為實參。

示例代碼如下:

復(fù)制代碼 代碼如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    cin >>a; 
    cout <<cin .rdstate()<<endl; 
    cin .clear(ios ::goodbit); 
    cout <<cin .rdstate()<<endl; 
    system("pause"); 
}

通常當(dāng)我們發(fā)現(xiàn)輸入有錯又需要改正的時候,使用clear()更改標(biāo)記為正確后,同時也需要使用get()成員函數(shù)清除輸入緩沖區(qū),以達(dá)到重復(fù)輸入的目的。

示例代碼如下:

復(fù)制代碼 代碼如下:

#include <iostream > 
using  namespace  std; 

int  main ()  

    int  a; 
    while (1) 
    { 
        cin >>a; 
        if (!cin )//條件可改寫為cin.fail() 
        { 
            cout <<"輸入有錯!請重新輸入"<<endl; 
            cin .clear(); 
            cin .get(); 
        } 
        else  
        { 
            cout <<a; 
            break ; 
        } 
    } 
    system("pause"); 
}

最后再給出一個對文件流錯誤標(biāo)記處理的例子,鞏固學(xué)習(xí),代碼如下:
復(fù)制代碼 代碼如下:

#include <iostream > 
#include <fstream > 
using  namespace  std; 

int  main ()  

    ifstream myfile("c://1.txt",ios_base::in,0); 
    if (myfile.fail()) 
    { 
        cout <<"文件讀取失敗或指定文件不存在!"<<endl; 
    } 
    else  
    { 
        char  ch; 
        while (myfile.get(ch)) 
        { 
            cout <<ch; 
        } 
        if (myfile.eof()) 
        { 
            cout <<"文件內(nèi)容已經(jīng)全部讀完"<<endl; 
        } 
        while (myfile.get(ch)) 
        { 
            cout <<ch; 
        } 
    } 
    system("pause"); 
}

相關(guān)文章

  • c++中引用作為形參的使用方法以及作用

    c++中引用作為形參的使用方法以及作用

    這篇文章主要給大家介紹了關(guān)于c++中引用作為形參的使用方法以及作用的相關(guān)資料,引用是地址傳值,作為引用的形參數(shù)值被修改的同時,也修改了對應(yīng)實參的值,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • C++實現(xiàn)LeetCode(169.求大多數(shù))

    C++實現(xiàn)LeetCode(169.求大多數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(169.求大多數(shù)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Qt 實現(xiàn)桌面雪花飄落代碼

    Qt 實現(xiàn)桌面雪花飄落代碼

    這篇文章主要介紹了Qt實現(xiàn)桌面雪花飄落代碼,有需要的朋友可以參考一下
    2013-12-12
  • c語言定時器示例分享

    c語言定時器示例分享

    在linux下開發(fā),使用的是C語言。適用于需要定時的軟件開發(fā),以系統(tǒng)真實的時間來計算,它送出SIGALRM信號。每隔一秒定時一次
    2014-04-04
  • C語言超詳細(xì)分析多進(jìn)程的概念與使用

    C語言超詳細(xì)分析多進(jìn)程的概念與使用

    在一個項目中并發(fā)執(zhí)行任務(wù)時多數(shù)情況下都會選擇多線程,但有時候也會選擇多進(jìn)程,例如可以同時運(yùn)行n個記事本編輯不同文本,由一個命令跳轉(zhuǎn)到另外一個命令,或者使用不同進(jìn)程進(jìn)行協(xié)作
    2022-08-08
  • 使用C++獲取邏輯執(zhí)行毫秒數(shù)的方法

    使用C++獲取邏輯執(zhí)行毫秒數(shù)的方法

    這篇文章主要為大家詳細(xì)介紹了如何使用C++獲取邏輯執(zhí)行毫秒數(shù)的方法,文中借助c++11提供的steady_clock,實現(xiàn)了精確獲取邏輯執(zhí)行時間的方法,需要的可以參考下
    2024-02-02
  • 教你Clion調(diào)試ROS包的方法

    教你Clion調(diào)試ROS包的方法

    Clion是一款專門開發(fā)C以及C++所設(shè)計的跨平臺的IDE,本文給大家介紹Clion調(diào)試ROS包的方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • C++詳細(xì)講解IO流原理

    C++詳細(xì)講解IO流原理

    當(dāng)程序與外界進(jìn)行信息交換時,存在兩個對象,一個是程序中的對象,另一個是文件對象。流是信息流動的一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動
    2022-05-05
  • Qt學(xué)習(xí)之容器類的使用教程詳解

    Qt學(xué)習(xí)之容器類的使用教程詳解

    Qt提供了多個基于模板的容器類,這些類可以用于存儲指定類型的數(shù)據(jù)項。本文主要介紹了Qt常用容器類的使用,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • C語言之包含min函數(shù)的棧實例詳解

    C語言之包含min函數(shù)的棧實例詳解

    這篇文章主要為大家詳細(xì)介紹了C語言之包含min函數(shù)的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論