アルゴ屋さんには文字列は無縁です

まあ自然言語処理とかやっている人は凄いんだろうけど。

とりあえず、大量にファイルを吐く必要があったので適当にファイル名にインデックスつけて吐いてみた。ファイル名の生成にostringstreamを使った。あとは0で埋める為にマニピュレータを利用した。

for( int number = 0; number < size; ++number ){
	std::ostringstream sout;
	sout << "file_" << std::setfill('0') << std::setw(6) << number;
	std::string name = sout.str();

	std::ofstream fout( name.c_str() );
	・・・
}

そしたら番号が1000を超えたところから出来たファイルにカンマが入り込んでいた

file_000000
file_000001
・・・
file_001,001
file_001,002

あれ?setfillとかsetwってそういう仕様だったっけ?それともstringstream側の問題かな?と思って別のサンプルプログラムを書いてみた。

for( int number = 0; number < size; ++number ){
	std::cout << "file_" << std::setfill('0') << std::setw(6) << number << std::endl;
}

そしたら問題なかった。じゃあやっぱりstringstream側の問題か?と思って同じプログラムでファイル出力でなくコンソール出力にしてみました。

for( int number = 0; number < size; ++number ){
	std::ostringstream sout;
	sout << "file_" << std::setfill('0') << std::setw(6) << number;
	std::string name = sout.str();

	std::cout << name << std::endl;
}

それでも問題なかった。なんでやねん(´・ω・`)??

で、結局原因はどうやらロケール設定が原因だったっぽいです。元のプログラムの最初にロケール設定が入っていました。

std::locale::global(std::locale("japanese"));

こいつが原因で勝手にカンマが入っていたようです。とりあえず、wcoutで日本語が表示したいのが目的だったのでwcoutに限定させました。

std::wcout.imbue( std::locale("japanese") );

これでようやく普通の通し番号のファイルを作ることが出来ました。無駄に時間を食ってしまったorz