StringStream

有一個類型叫 iostream,它同時是輸入流也是輸出流,而 stringstream 正是一種 iostream。它不像標準流,有固定的輸出去向或輸入來源,簡單來講,它就是一個流水線,你可以從任何地方放東西進去、然後再把裡面的東西拿出來到任何地方。像是你就無法在程式中把標準輸出流的緩衝區裡的東西拿出來,你只能在 terminal 或它導向的檔案裡見到你放進標準輸出流的東西(就是你輸出的東西)。

直接來看個範例就可以暸解用法了:

1
2
3
4
5
stringstream ss;
ss << 5;
int t;
ss >> t;
cout << t << "\n";

最後的輸出是 5,可以看到它既可以 << 也可以 >>,在第 2 行做的事情是把 5 丟進 ss 裡面,只要是可以給 cout 輸出的類型都可以這麼做,而第 4 行做的事是把 ss 裡的東西拿出來,然後放到變數 t,於是 t 就變成 56 了,同樣地,可以用 cin 輸入到的類型都可以這麼做,而它的行為和 cin 也一模一樣,像是:

1
2
3
4
5
stringstream ss;
ss << 5 << " " << 6;
int t;
ss >> t;
cout << t << "\n";

第 2 行改成了把 5 丟進去、把含有一個空白的字串丟進去、再把 6 丟進去,這個時候流裡面會是 ,中間有一個空白,所以在第 4 行輸出東西到 t 的時候,和 cin 一樣會根據空白分割字串,只有 5 進到了 t 且離開了流,空白和 6 還留在其中。

至於 stringstream 有什麼用處呢?除了可以把各種類型互相轉換外(有實作輸入或輸出方法的類型),還有像是有些題目的輸入格式比較討厭,一個檔案多筆測資、一筆測資占一行,但又不告訴你一筆測資有幾個數字,這個時候你就可以先用 getline 把整行讀到一個 string、然後再用 stringstream 做分割。