C++ で STLStringstream クラスを使用する

胡金庫 2023年10月12日
C++ で STLStringstream クラスを使用する

この記事では、C++ で STL stringstream クラスを使用する方法を示します。

C++ の文字列ストリームで stringstream クラスを使用して入出力操作を実行する

STL ストリームベースの I / O ライブラリクラスには、通常、文字ベース、ファイル、文字列の 3 種類があります。それらのそれぞれは、通常、それらのプロパティに最も適したシナリオに使用されます。つまり、文字列文字列は、一部の I / O チャネルに接続するのとは対照的に、データを格納するための一時的な文字列バッファを提供しません。std::stringstream クラスは、文字列ベースのストリームの入出力操作を実装します。このタイプのオブジェクトは、ストリーム操作と強力なメンバー関数を使用して操作できる文字列バッファーとして扱うことができます。

stringstream クラスに含まれる最も便利な関数の 2つは、strrdbuf です。最初のものは、基になる文字列オブジェクトのコピーを取得するために使用されます。返されるオブジェクトは一時的なものであり、式の終わりを破壊することに注意してください。したがって、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 関数を使用してコンテンツを取得すると、すべてが文字列型であり、そのように扱うことができます。

文字列ベースのストリームオブジェクトには、stringstreamistringstream、および 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ IO