C++Builder2007まではコンパイルできた次のコードが、C++Builder2009ではコンパイルエラーになります。
String dir = "C:\\日本語.txt";
FILE* f = fopen(dir.c_str(), "rt");
[BCC32 エラー] File1.cpp(14): E2034 'wchar_t *' 型は 'const char *' 型に変換できない
[BCC32 エラー] File1.cpp(14): E2342 パラメータ '__path' は const char * 型として定義されているので wchar_t * は渡せない
StringがAnsiStringからUnicodeStringに変わったため、String#c_str()の返す型がchar*からwchar_t*に変わりました。
fopenには引数にchar*を受け取るfopen(char*)はありますが、wchar_t*を受け取るfopen(wchar_t*)は存在せず、C++Builder2009ではコンパイルエラーになります。
C++Builder2009でも一度AnsiStringに変換するか、_wfopenを使えば、コンパイル可能です。
# AnsiStringに変換
FILE* f = fopen(AnsiString(dir).c_str(), "rt");
# _wfopenを使用
FILE* f = _wfopen(dir.c_str(), L"rt");
AnsiStringに変換した方のコードはfopen(char*)を使用しますが、
FILE* fp = fopen("日本語.txt","rt");
あるいは
std::ifstream file("日本語.txt");
これ、現在のC/C++では正しく 日本語.txt が
オープンできる保証はどこにもないんです。少なくとも言語仕様としては。
なのだそうです。
コメント欄も勉強になります。
今まで意識したことがありませんでしたが、微妙な問題があるのですね。
C++0xでは、UTF-8, UTF-16, UTF-32の三つのUnicode符号化方式がサポートされる。
C++0xによって、このあたりがどのように変わるのでしょう。