目次
はじめに
C++で、数値を文字列に変換したり、逆に文字列を数値に変換したり、あるいはスペースで区切られた文字列を単語ごとに分解したい、といった場面は頻繁にあります。
標準ライブラリ <sstream>
ヘッダーで提供される「文字列ストリーム」を使えば、これらの処理を、cout
や cin
と全く同じ <<
/ >>
演算子を使った、慣れ親しんだ直感的な構文で実現できます。
この記事では、文字列ストリームの主要な2つのクラスの使い方を解説します。
std::ostringstream
: 様々なデータを文字列に書き込む(フォーマットする)ために使う。std::istringstream
: 文字列を読み込んで、様々なデータに分解(パース)するために使う。
1. std::ostringstream
: 文字列を構築(書き込み)する
ostringstream
(output string stream) は、<<
演算子で渡された様々なデータ(数値、文字列など)を、内部の文字列バッファにどんどん追記していきます。最後に .str()
メンバ関数を呼び出すと、構築された std::string
を取得できます。
サンプルコード
#include <iostream>
#include <sstream> // 文字列ストリーム
#include <string>
using namespace std;
int main() {
ostringstream oss;
string item = "リンゴ";
int price = 120;
int count = 3;
// 1. << 演算子で、様々な型のデータをストリームに書き込む
oss << "商品: " << item
<< ", 単価: " << price << "円"
<< ", 数量: " << count << "個"
<< ", 合計: " << price * count << "円";
// 2. .str()で、構築された文字列を取得
string result = oss.str();
cout << result << endl;
return 0;
}
実行結果
商品: リンゴ, 単価: 120円, 数量: 3個, 合計: 360円
2. std::istringstream
: 文字列を分解(読み込み)する
istringstream
(input string stream) は、既存の文字列を元に作成され、>>
演算子を使って、スペースや改行で区切られたデータを、あたかも cin
から読み込むかのように、変数に一つずつ取り出すことができます。
サンプルコード
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string source_data = "佐藤 35 開発部";
// 1. 読み込みたい文字列で istringstream を初期化
istringstream iss(source_data);
string name, department;
int age;
// 2. >> 演算子で、スペース区切りのデータを順番に変数に読み込む
iss >> name >> age >> department;
// 3. 読み込んだ結果を確認
cout << "氏名: " << name << endl;
cout << "年齢: " << age << "歳" << endl;
cout << "部署: " << department << endl;
return 0;
}
実行結果
氏名: 佐藤
年齢: 35歳
部署: 開発部
まとめ
今回は、C++の文字列ストリームの基本的な使い方を解説しました。
ostringstream
: 様々な型のデータを組み合わせて、一つの整形された文字列を構築するのに使う。istringstream
: スペースなどで区切られた文字列を、個々のデータに分解するのに使う。stringstream
: 一つのオブジェクトで、読み書き両方が可能なものもあります。
文字列ストリームを使いこなすことで、複雑な文字列のフォーマットやパース処理を、cout
/cin
と同じ直感的なインターフェースで、安全かつ簡潔に記述することができます。