stringstreamを使ってみたんだよ
C++でstringstreamを使ってみた。
空白区切り
何がしたかったかというとC++で空白区切りの文字列を処理したかった。
しかし、C++にはsplit関数がない。そこでstringstreamが使えるらしい。
ソースコード
#include <iostream> #include <string> #include <sstream> using namespace std; int main(){ string s = "abc def ghi jkl mno"; stringstream ss; ss << s; string ret; while(!ss.eof()){ ss >> ret; cout << ret << endl; } }
出力
abc def ghi jkl mno
のようになる。
文字列から数値への変換
stringstreamを使えば文字列を数値に変換することもできるらしい
ソースコード
#include <iostream> #include <string> #include <sstream> using namespace std; int main(){ string s ="3.141592"; stringstream ss; double pi; ss << s; ss >> pi; cout << pi << endl; }
出力
3.141592
また文字列が数字とそれ以外が混ざっていた場合次のようになる
#include <iostream> #include <string> #include <sstream> using namespace std; int main(){ string s1 = "3.14aaa"; string s2 = "aa3.14"; string s3 = "aa3.14aa"; string s4 = "3.1hoge415"; stringstream ss1,ss2,ss3,ss4; double d1=0,d2=0,d3=0,d4=0; ss1 << s1; ss2 << s2; ss3 << s3; ss1 >> d1; cout << d1 << endl; ss2 >> d2; cout << d2 << endl; ss3 >> d3; cout << d3 << endl; ss4 >> d4; cout << d4 << endl; }
出力
3.14 0 0 3.1
読み飛ばし
ignoreを使えば読み飛ばしができる。
ignore(n,delim)で
「最大n文字を読み飛ばす。もしくはdelimに一致するするまで読み飛ばす。」
となる。
但し引数がなければignore(1,EOF)となる。
例
#include <iostream> #include <string> #include <sstream> using namespace std; int main(){ string s = "123,456"; stringstream ss; int r1,r2; ss << s; ss >> r1; ss.ignore(); ss >> r2; cout << r1 << " : " << r2 << endl; }
123 : 456