★文字列ストリーム★


前に説明したstring型は様々な文字列操作が可能ですが、C言語のsprintf関数のように文字列や数値が混在したデータを文字列にする事が出来ません。

<sample program cpp040-01>

#include <iostream>
#include <string>

int main()
{
    std::string str;

    str = "ABC";

    str += 90;

    str += "DEF";

    std::cout << str << std::endl;

    return 0;
}

<実行結果>

ABCZDEF
続行するには何かキーを押してください・・・

このプログラムはエラーも出ないため実行できますが、結果を見てください。

str += 90;

この部分で数値を連結しているように見えますが、string型は文字を入れるものですから、「90」を文字に見立てます。

文字コードで「90」は「 Z 」です。

ですから、結果は「"ABC"」と「"DEF"」の間に「 Z 」が入っているのです。


本当は「ABC90DEF」と言う文字列を作りたかったのですが、どうすれば出来るでしょうか。

これは、文字列ストリーム(stringstream)と言うものを使う事で可能になります。

stringstreamを使うと、文字列をストリームのように使う事が出来るようになります。

1つサンプルを書いてみます。

<sample program cpp040-02>

#include <iostream>
#include <string>
#include <sstream>

int main()
{
    std::stringstream ss;

    ss << "Hello ";

    ss << 123;

    ss << " World";

    std::cout << ss.str() << std::endl;

    return 0;
}

<実行結果>

Hello 123 World
続行するには何かキーを押してください・・・

stringstreamを使うには、「sstream」ヘッダをインクルードする必要があります。

ストリームですから「<<」で出力する事が出来ます。

文字列と数値なども区別して出力している事が分かります。

stringとは違いますので、表示するには、

ss.str()

のように、str関数を呼び出しstring型に変換する必要があります。


もう1つstringと異なる事は、ストリームなので前回やった「書式」も使えるという事です。

例えば、数値でファイル番号を保管しておき、その番号からファイル名を作る事があります。

C言語のsprintf関数を使うと↓の通りです。

<sample program cpp040-03>

#include <stdio.h>

int main()
{
    char filename[100];

    int fileNo = 1;

    sprintf(filename, "file%02d.txt", fileNo);

    printf("%s\n", filename);

    return 0;
}

<実行結果>

file01.txt
続行するには何かキーを押してください・・・

ファイル番号が変わるとファイル名も変わります。


これをstringstreamで書き直します。

<sample program cpp040-04>

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>

int main()
{
    int fileNo = 1;

    std::stringstream ssFilename;

    ssFilename << "file";

    ssFilename << std::setfill('0') << std::setw(2) << fileNo;

    ssFilename << ".txt";

    std::cout << ssFilename.str() << std::endl;

    return 0;
}

<実行結果>

file01.txt
続行するには何かキーを押してください・・・

次もstringstreamについて書きます。


次へ

戻る

目次へ