C++ で STLStringstream クラスを使用する
この記事では、C++ で STL stringstream クラスを使用する方法を示します。
C++ の文字列ストリームで stringstream クラスを使用して入出力操作を実行する
STL ストリームベースの I / O ライブラリクラスには、通常、文字ベース、ファイル、文字列の 3 種類があります。それらのそれぞれは、通常、それらのプロパティに最も適したシナリオに使用されます。つまり、文字列文字列は、一部の I / O チャネルに接続するのとは対照的に、データを格納するための一時的な文字列バッファを提供しません。std::stringstream クラスは、文字列ベースのストリームの入出力操作を実装します。このタイプのオブジェクトは、ストリーム操作と強力なメンバー関数を使用して操作できる文字列バッファーとして扱うことができます。
stringstream クラスに含まれる最も便利な関数の 2つは、str と rdbuf です。最初のものは、基になる文字列オブジェクトのコピーを取得するために使用されます。返されるオブジェクトは一時的なものであり、式の終わりを破壊することに注意してください。したがって、str 関数の結果から関数を呼び出す必要があります。
引数として文字列オブジェクトを使用して同じプロセスを呼び出し、指定された値で stringstream の内容を設定できます。cout ストリームに挿入するときは、常に stringstream オブジェクトの str 関数を呼び出す必要があります。そうしないと、コンパイラエラーが発生します。以前の動作は C++ 11 標準以降に実装されていることにも注意してください。
一方、rdbuf メンバー関数を使用して、基になる生の文字列オブジェクトへのポインタを取得できます。これは、文字列オブジェクトが cout ストリームに渡されたかのように機能します。その結果、次の例に示すように、バッファの内容が出力されます。
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::istringstream;
using std::stringstream;
int main() {
stringstream ss1;
ss1 << "hello, the number " << 123 << " and " << 32 << " are printed" << endl;
cout << ss1.str();
stringstream ss2("Hello there");
cout << ss2.rdbuf();
return EXIT_SUCCESS;
}
出力:
hello, the number 123 and 32 are printed
Hello there
stringstream クラスのもう 1つの機能は、数値を文字列型に変換できることです。前のコードスニペットが文字列リテラルと数値を stringstream オブジェクトに挿入したことに注意してください。さらに、str 関数を使用してコンテンツを取得すると、すべてが文字列型であり、そのように扱うことができます。
文字列ベースのストリームオブジェクトには、stringstream、istringstream、および ostringstream の 3つがあります。後者の 2つは、それぞれ入力操作と出力操作のみを提供するため、異なります。これは、一部のメンバー関数が特定のストリームタイプにのみ影響することを意味します。
たとえば、次のコードサンプルは、stringstream オブジェクトと istringstream オブジェクトで putback 関数を個別に呼び出します。putback メンバー関数は、入力ストリームに単一の文字を追加するために使用されます。したがって、入力プロパティと出力プロパティを提供する stringstream オブジェクトでのみ成功します。
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::istringstream;
using std::stringstream;
int main() {
stringstream ss2("Hello there");
cout << ss2.rdbuf();
if (ss2.putback('!'))
cout << ss2.rdbuf() << endl;
else
cout << "putback failed" << endl;
istringstream ss3("Hello there");
ss3.get();
if (ss3.putback('!'))
cout << ss3.rdbuf() << endl;
else
cout << "putback failed" << endl;
return EXIT_SUCCESS;
}
出力:
Hello there!
putback failed
