前に説明した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について書きます。