basic_stringstream

以前やったistringstreamとostringstreamの両方の機能を持っているのが、stringstreamであり正体はbasic_stringstream。

std::basic_stringstream - cppreference.com

複雑だけど、basic_istringstreamとbasic_ostringstreamから継承してるわけではない。
これ1個で文字列への入力と出力ができるか試す。

// ヘッダのインクルード
#include <iostream> // C++標準入出力
#include <sstream> // 新文字列ストリーム
#include <string> // std::string

// main関数
int main(){

  // オブジェクトの宣言
  std::basic_stringstream<char> css; // cssを宣言.
  std::string str; // 文字列str.
  int i; // 整数値i.
  float f; // 浮動小数値f.

  // 文字列, 整数値, 浮動小数値を一気に書き込む.
  css << "ABC" << 123 << 0.456; // "ABC", 123, 0.456をcssに連続して書き込む.

  // cssの中身を出力.
  std::cout << "css.str = " << css.str() << std::endl; // css.strで中身の文字列を取得し, それを出力.

  // cssから読み込んだ値を各変数に割り当てる.
  css >> str >> i >> f; // cssから読み込んだ値をstr, i, fに格納.

  // それぞれの値を出力.
  std::cout << "str = " << str << ", i = " << i << ", f = " << f << std::endl; // str, i, fを出力.

  // プログラムの終了
  return 0; // 0を返して正常終了.

}

こうすると、

$ vi basic_stringstream.cpp
$ g++ basic_stringstream.cpp -o basic_stringstream
$ ./basic_stringstream
css.str = ABC1230.456
str = ABC1230.456, i = 0, f = 5.88352e-39
$

こうなってしまう。

cssへの書き込みで区切り文字(空白類)がないので、cssからの読み込みで失敗してる。

スペースをつければ、

$ vi basic_stringstream.cpp
$ g++ basic_stringstream.cpp -o basic_stringstream
$ ./basic_stringstream
css.str = ABC 123 0.456
str = ABC, i = 123, f = 0.456
$

ちゃんと分離出来た。

Sample/cpp/basic_stringstream/basic_stringstream/src/basic_stringstream at master · bg1bgst333/Sample · GitHub