読者です 読者をやめる 読者になる 読者になる

VC2005のifstremで日本語ファイル名を使用する

普段の「ちょっとしたツール」を使うのに使用する言語をC++で書いているのだけれど、ファイル入出力は手馴れたfopen/fread/fcloseで処理でこなしてました。
昨日やはり数十個のファイルを処理する必要に駆られ、この際だからifstreamで書いてみたところ、漢字ファイル名が処理できないのが判明。わんくま同盟の掲示板に載っていたのを思い出し、ロケールを設定するも、今度はcoutがシフトJISの日本語を受け付けず。仕方が無いのでBorlandC++でしのぐ。
今日改めて試行錯誤したところ

  • ifstreamがファイル名としてwchar_tの文字列を受け付ける
  • argv[]にはシフトJISで入っているので、mbstowcsで変換すればOKだろう

というところまでつかむ。
けれどもこのmbstowcsが曲者で、やはりロケールを設定してやらないと変換を行ってくれず、結果はシフトJISのまま。
結局 ifstream のインスタンス生成時のロケールのみ設定してやり、生成後に戻すことを思いついて試すと良い感じ。BorlandC++でもコンパイル・実行ともOKと相成りました。
ただこれはVC2005のバグでVC2008だと問題が無いとのこと。うーむ。

std::locale::global(std::locale(""));
std::ifstream ifs(argv[1]);
std::locale::global(std::locale("C"));