【C++】文字列ストリーム (stringstream) の使い方 | メモリ上で文字列を読み書きする

目次

はじめに

C++で、数値を文字列に変換したり、逆に文字列を数値に変換したり、あるいはスペースで区切られた文字列を単語ごとに分解したい、といった場面は頻繁にあります。

標準ライブラリ <sstream> ヘッダーで提供される「文字列ストリーム」を使えば、これらの処理を、coutcin と全く同じ << / >> 演算子を使った、慣れ親しんだ直感的な構文で実現できます。

この記事では、文字列ストリームの主要な2つのクラスの使い方を解説します。

  1. std::ostringstream: 様々なデータを文字列に書き込む(フォーマットする)ために使う。
  2. 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 と同じ直感的なインターフェースで、安全かつ簡潔に記述することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次