IO相關3(string流)
sstream 頭文件定義了三個類型來支持內存 IO,這些類型可以向 string 寫入數據,從 string 讀取數據,就像 string 是一個 IO 流一樣。
istringstream 從 string 讀取數據,ostringstream 向 string 寫入數據,stringstream 既可以從 string 讀取數據也可以向 string 寫入數據。類似於 fstream,sstream 中定義的類型也都是繼承自 iostream 中的類型。除了繼承來的操作,sstream 中定義的類型還增加了一些成員來管理與流相關的 string。可以對 stringstream 對象調用這些操作,但不能對其他 IO 類型調用這些操作:
1 sstream strm;//strm是一個未綁定的stringstream對象.sstream是頭文件sstream中定義的一個類型 2 sstream strm1(s);//strm是一個sstream對像,保存string s的一個拷貝.此構造函數是explicit的 3 strm.str();//返回strm所保存的string拷貝 4 strm.str(s);//將string s拷貝到strm中.返滬void
使用 istringstream:
假定有一個文件,列出了一些人和它們的電話號碼。某些人只有一個號碼,而另一些人則有多個——家庭電話,工作電話,移動電話等。我們輸入的文件可能是:
morgan 2017347 72849289
jfsl 7823434
jfkds 7384534 58349578 59308509
每條記錄都以一個人名開始,後面跟著一個或多個電話號碼。我們首先定義一個簡單的類來描述輸入數據:
1 //成員默認為共有 2 struct person_info{ 3 string name;//存儲人名 4 std::vector<string> phones;//存儲電話號碼 5 };
1 #include <iostream> 2 #include <sstream> 3 #include <vector> 4using namespace std; 5 6 //成員默認為共有 7 struct person_info{ 8 string name;//存儲人名 9 std::vector<string> phones;//存儲電話號碼 10 void print(void) const{ 11 cout << name; 12 for(const auto p : phones){ 13 cout << " " << p; 14 } 15 cout << endl; 16 } 17 }; 18 19 int main(void){ 20 string line, word;//分別保存來自輸入的一行和單詞 21 std::vector<person_info> people;//保存來自輸入的所有記錄 22 23 while(getline(cin, line)){ 24 person_info info;//創建一個保存此記錄的數據對象 25 istringstream record(line);//將記錄綁定到剛讀入的行 26 record >> info.name; 27 while(record >> word){ 28 info.phones.push_back(word); 29 } 30 people.push_back(info);//將此記錄追加到people末尾 31 // info.print(); 32 } 33 34 for(const auto info : people){ 35 info.print(); 36 } 37 return 0; 38 }
使用 ostringstream:
當我們逐步構造輸出,希望最後一起打印時,ostringstream 是很有用的。如:在上一個例子中,我們可能像逐個驗證電話號碼並改變其格式。如果所有號碼都是有效的,我們希望輸出一個新的文件,包含改變格式後的號碼。對於那些無效號碼,我們不會將它們輸出到新文件中,而是打印一條包含人名和無效號碼的錯誤信息。
由於我們不希望輸出有無效號碼的人,因此對於每個人,知道驗證完所有電話號碼後才可以進行輸出操作。但是我們可以先將輸出內容 "寫入" 到一個內存 ostringstream 中:
1 #include <iostream> 2 #include <sstream> 3 #include <vector> 4 using namespace std; 5 6 //成員默認為共有 7 struct person_info{ 8 string name;//存儲人名 9 std::vector<string> phones;//存儲電話號碼 10 void print(void) const{ 11 cout << name; 12 for(const auto p : phones){ 13 cout << " " << p; 14 } 15 cout << endl; 16 } 17 }; 18 19 bool valid(const string &s){ 20 21 } 22 23 bool format(const string &s){ 24 25 } 26 27 int main(void){ 28 string line, word;//分別保存來自輸入的一行和單詞 29 std::vector<person_info> people;//保存來自輸入的所有記錄 30 31 while(getline(cin, line)){ 32 person_info info;//創建一個保存此記錄的數據對象 33 istringstream record(line);//將記錄綁定到剛讀入的行 34 record >> info.name; 35 while(record >> word){ 36 info.phones.push_back(word); 37 } 38 people.push_back(info);//將此記錄追加到people末尾 39 // info.print(); 40 } 41 42 for(const auto &entry : people){ 43 ostringstream formatted, bad_nums; 44 for(const auto &nums : entry.phones){ 45 if(!valid(nums)) bad_nums << " " << nums; 46 else formatted << " " << format(nums); 47 } 48 if(bad_nums.str().empty()) cout << entry.name << " " << formatted.str() << endl; 49 else cout << "input error: " << entry.name << " invalid number(s) " << bad_nums.str() << endl; 50 } 51 return 0; 52 }
sstream 通常用於格式轉換:
http://blog.csdn.net/xiaogugood/article/details/21447431
IO相關3(string流)