« Delphi 2009への既存コード移行のポイント | メイン | Delphi 2009 / C++Builder 2009 Update 2 »

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によって、このあたりがどのように変わるのでしょう。

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/862

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2008年12月12日 13:45に投稿されたエントリーのページです。

ひとつ前の投稿は「Delphi 2009への既存コード移行のポイント」です。

次の投稿は「Delphi 2009 / C++Builder 2009 Update 2」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35