1. 程式人生 > >IO相關3(string流)

IO相關3(string流)

nes for val 的人 有用 ugo oid 支持 struct

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>
 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 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流)