C++Builder2009におけるStringの変更による既存コードの修正

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 – Wikipedi

C++0xによって、このあたりがどのように変わるのでしょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください