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