從c++ istringstream讀取字符(一)

c++ istringstream讀取字段之operator>>

istringstream的繼承關係如下:

在這裏插入圖片描述

operator>>操作符繼承istream,爲extraction operator(導出符),它被重載爲以下3類成員函數:

  1. arithmetic types(算術類型)

    istream& operator>> (bool& val);
    istream& operator>> (short& val);
    istream& operator>> (unsigned short& val);
    istream& operator>> (int& val);
    istream& operator>> (unsigned int& val);
    istream& operator>> (long& val);
    istream& operator>> (unsigned long& val);
    istream& operator>> (long long& val);
    istream& operator>> (unsigned long long& val);
    istream& operator>> (float& val);
    istream& operator>> (double& val);
    istream& operator>> (long double& val);
    istream& operator>> (void*& val);
    

功能:連續地從流中導出並解析字符集,將之轉換爲合適的值類型(同val的類型)。

內部實現:該方法通過構造一個哨兵對象(noskipws is false,忽略空白字符)進行訪問輸入序列, 然後調用

num_get::get來進行導出和解析操作,相應的調整流的內部狀態,最後在返回之前,銷燬哨兵對象。

有幾個需要關注的點:

  • noskipws 設置爲false,會忽略前面連續的空白字符,直到遇到一個非空字符。

    樣例:

    std::string s("  12a");
    std::istringstream iss(s);
    int val = -1;
    iss >> val; // 首先忽略連續的空白字符,找到第一個不爲空白字符1,然後使用num_get::get獲取能夠轉換爲int型的字符集,並將之轉換爲int型
    std::cout >> val >> std::endl;
    

    輸出:

    12

  • 調用num_get::get將字符集轉換成相應的值,有可能發生錯誤,內部狀態可以使用rdstate()獲取。

樣例:

std::string s("  2147483648a");
std::istringstream iss(s);
int val = -1;
iss >> val; // 首先忽略連續的空白字符,找到第一個不爲空白字符1,然後使用num_get::get獲取能夠轉換爲int型的字符集,並將之轉換爲int型
if ((iss.rdstate() & std::istringstream::failbit) != 0) { // 判斷是讀取是否出錯,有int的最大值爲2147483647,所以當轉換的過程中會產生錯誤
    std::cout << "iss >> len(int) error" << std::endl;
}
std::cout >> val >> std::endl;

輸出:

iss >> len(int) error
2147483647

當不能進行轉換的時候,就會將錯誤狀態寫入到 stream’s internal state flags ,通過rdstate獲取

在這裏插入圖片描述

  1. stream buffers
istream& operator>> (streambuf* sb );

功能: 儘可能多的從流中導出字符到被stream buffer對象(sb指向的)控制的輸出序列裏,直到輸入序列用盡或者無法插入到sb指向的stream buffer對象。

內部實現:該函數被視爲執行未格式化的輸入:在內部,該函數通過首先構造一個哨兵對象(將noskipws設置爲true)來訪問輸入序列。 然後(如果良好),它將從其關聯的流緩衝區對象中提取字符,就像調用其成員函數sbumpc或sgetc一樣,並最終在返回之前銷燬哨兵對象。
可以通過調用成員gcount來訪問此函數成功讀取和存儲的字符數。

樣例:

std::string s("Hello World");
std::istringstream iss(s); // 將字符串轉換成輸入流

// stream buffers
std::stringbuf stringbuf;
iss >> &stringbuf;
std::cout << stringbuf.str() << std::endl;

輸出:

Hello World

  1. manipulators
istream& operator>> (istream& (*pf)(istream&));
istream& operator>> (ios& (*pf)(ios&));
istream& operator>> (ios_base& (*pf)(ios_base&));

功能:調用pf(* this),其中pf可能是一個操縱器。
操縱器是專門設計用於與該操作符一起使用的功能。
此操作對輸入序列沒有影響,也不會提取任何字符(除非操縱器本身這樣做,例如ws)。

樣例:

std::string s("5A false Hello5 World  ");
std::istringstream iss(s);
int i;
iss >> std::hex >> i;
std::cout << i << std::endl;// 5A的十進制爲90
bool flag;
iss >> std::boolalpha >> flag;
std::cout << std::boolalpha << flag << std::endl;

輸出:

90
false

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