2017年1月7日土曜日

c++ ログ出力について:stringstream

プログラムの動作ログとしてよく文字列のログファイルを作成します。これまではよくcからのくせで、sprintf()文を使ってきました。
しかしこれって、char*を使っていますから危ないですよね。(メモリ破壊やセキュリティ上も)できれば、c++のbasic_stringを使った方がいいです。そこで、stringstrream型を使います。(それにM$のVisualStudioだと微妙に文法がg++と違い、やたらwarningを出してきます。両方で動作するプログラムを作成するとき嫌な思いをこれまでしてきました。)

改めてサンプルを作ろうと思い調べてみたら、stringstreamにはヘッダとして、strstreamとsstreamの2つがあるとのこと。違いは、strstreamの方が先輩なんですが実装にchar*を使っているとのこと。危険なので、内部の実装をbasic_stringなsstreamを使えとのことです。

まあ面倒なことはおいといて、一目でわかるサンプルを以下に示します。

// sstreamのサンプル
// :strstreamは内部でchar*を使っているので、basic_stringを使っているsstreamが推奨されている
#include <iostream>
#include <sstream>
int main()
{
std::stringstream ss;
double pi;
double pi1;
// 文字列から数値に変換.
ss << "3.14";
ss >> pi;
pi1 = pi + 1.0; // 数値型になっているので演算できます
std::cout << std::showpoint << pi << ", " << pi1 << std::endl;
ss.clear(); // 状態をクリア.
ss.str(""); // 文字列をクリア. ここが注意、clear()だけでは内部の文字列は消去できません.
// 数値から文字列に変換.
std::string ss1;
ss << 123 ;
ss1 = ss.str() + "456"; // stirng型として演算します
std::cout << ss.str() << ", " << ss1 << std::endl;
return 0;
}
実行すると以下の様な感じになります。

bash-3.2$ ./sstream
3.14000, 4.14000
123, 123456

まず、文字列をdoubleに変換して+1.0しています。次が数値をstirngsttreamに取り込み、string型でappendしています。これで大概のことはできます。

0 件のコメント:

コメントを投稿