stringstreamを使用したタイプ変換と文字列分割

4116 ワード

C++標準ライブラリにおけるは、ANSI Cよりも単純性、タイプセキュリティ、拡張性など、より高度な機能があります.
慣れたらh>スタイルの転換、あなたはまず聞くかもしれません:どうしてに基づくタイプの転換を学ぶのに余分な精力を使うのですか?次の簡単な例の回顧に説得できるかもしれません.変数をintタイプから文字列タイプにsprintf()関数で変換したいとします.このタスクを正しく完了するには、変換された文字列を格納するのに十分なスペースがあることを確認する必要があります.また、正しいフォーマットも使用する必要があります.不正なフォーマットを使用すると、予知されていない結果になります.次に例を示します.
int n=10000;



chars[10];



sprintf(s,”%d”,n);     // s     “10000”
           。  ,                    :
int n=10000;



char s[10];



sprintf(s,”%f”,n);    //

この場合、プログラマは%dの代わりに%fフォーマットを誤って使用した.したがって、sはsprintf()を呼び出した後に不確定な文字列を含む.正しいタイプを自動的に導き出せるなら、もっといいのではないでしょうか.
stringstreamに入るとnとsのタイプがコンパイル期間中に決定されるため、コンパイラはどの変換が必要かを判断するのに十分な情報を持っている.ライブラリで宣言された標準クラスは、これを利用して、必要な変換を自動的に選択します.また、変換結果はstringstreamオブジェクトの内部バッファに保存されます.バッファオーバーフローを心配する必要はありません.これらのオブジェクトは、必要に応じてストレージ領域を自動的に割り当てます.
ライブラリは、istringstream、ostringstream、stringstreamの3種類を定義し、それぞれストリームの入出力操作に使用されます.また、各クラスには対応するワイド文字セットバージョンがあります.簡単に言えば、私は主にstringstreamを中心にしています.各変換は入力と出力操作に関連しているからです.なお、は文字配列の代わりにstringオブジェクトを使用します.これにより、バッファオーバーフローの危険を回避できます.また,入力パラメータとターゲットオブジェクトのタイプが自動的に導出され,不正なフォーマットを用いても危険ではない.stringからintへの変換
string result=”10000”;



int n=0;



stream<<result;



stream>>n;     //n  10000

stringstreamオブジェクトの再利用
複数回の変換で同じstringstreamオブジェクトを使用する場合は、変換するたびにclear()メソッドを使用することを覚えておいてください.
複数回の変換で同じstringstream(毎回新しいオブジェクトを作成するのではなく)オブジェクトを繰り返し使用する最大の利点は、効率です.stringstreamオブジェクトの構造と構造関数は、通常、CPUに非常に時間がかかります.
.clear()はクリアフラグビットです.str()はクリアコンテンツ
istringstream
istringstreamはstringオブジェクトによって構築され、istringstreamクラスはstringオブジェクトから文字を読み出す.   (a)   istringstream istr;         istr.str("1 56.7",);(b)上記2つのプロセスはistringstream istr(「1 56.7」)と簡単に書くことができる.
ostringstreamはstringオブジェクトに出力する文字です
    ostringstream ostr;
a.文字列を取得する.str();
b.毎回異なる使用時刻にssをクリアしなければならない.str(""), iss.str(""), oss.str(「」)は、しばらく他のクリアメソッドは見つかりませんでした
 
 
文字列の分割/split関数の簡単な実現
stringstreamのもう一つの用途は文字列の分割です.std::stringではsplit関数は実装されていません(Javaのstringではsplit関数が実装されており、使い勝手が非常に便利です).このためstringstreamを使用して文字列の分割を行うことができます.以下に示します.
    std::string str_temp = "hello   world   !";

    std::stringstream stream1(str_temp);

    while(stream1 >> str_temp){

        printf("%s
",str_temp.c_str()); }

を選択します.上記のstringstreamはistringstreamで代用できます.
セクションの一部はhttp://www.cnblogs.com/yaozhongxiao/archive/2009/05/23/1487903.htmlから選択されています
(完)