2017-09-26 9 views
0

C関数(fopen)でファイルを開き、そのハンドルをC++ファイルストリーム(fstream ...)に割り当てることはできますか?CファイルハンドルをC++ファイルストリームに割り当てる

質問:Windows上でUTF8を処理したいが、fstreamクラスにはconst char* ctor/openメソッドしかありません。だから私はC APIを使用してそれを開き、ストリームオブジェクトを使用してそれを使用する必要があります。

ブーストストリームライブラリでは、独自のシンク/ソースを指定することは可能ですが、どこから開始するのかはわかりません。

説明:UTF8文字列として指定されたパスを含むファイルを開きたいとします。したがって、ファイルオープンメソッドは、fstreamでないUTF8パスをサポートする必要があります。 const wchar_t*を受け入れるMSVC拡張機能は役に立ちますが、MinGWはこれらのオーバーロードを提供しません。だから私はwfopenを代わりにウィンドウで使用する必要があります。

+0

私は何かが不足しているかもしれませんが、 'UTF-8'は通常の' char * 'バッファを必要とします。また、fstream openメソッドはファイル名のみを扱うので、ファイルのエンコーディングには何の違いもありません。 fstreamを使ってファイルを開くのがなぜ機能しないのか、もっと詳しく説明できますか? – Galik

+0

'fstream'からの文字列の読み込みは、どのロケールが割り当てられているかによって異なります。 –

+0

ファイル名はUTF8です。追加しました。 – Flamefire

答えて

1

C関数(fopen)でファイルを開き、そのハンドルをC++ファイルストリーム(fstream ...)に割り当てることはできますか?

しかし、FILE*を使用してI/Oを処理するカスタムstd::streambuf派生クラスを作成(または検索)し、そのクラスのインスタンスを標準のstd::istreamオブジェクトに割り当てることができます。お手伝いするstd::basic_filebufの実装、またはGNUのstdio_filebufクラスを参照してください。

パスをUTF8文字列として指定してファイルを開きたいとします。したがって、ファイルオープンメソッドは、fstreamでないUTF8パスをサポートする必要があります。 const wchar_t*を受け入れるMSVC拡張機能は役に立ちますが、MinGWはこれらのオーバーロードを提供しません。だから私はwfopenを代わりにウィンドウで使用する必要があります。

WindowsのほとんどのUnicode APIは、UTF-8のみをサポートしています.UTF-16はサポートされていません。したがって、wchar_tは、Visual C++やその他の互換性のあるコンパイラでオーバーロードされます。 Mingwはこれらの拡張機能をサポートしていません。しかし、サードパーティのソリューションがあります。例えば、Pathie(​​およびPathie::ofstreamクラスを参照)。

+0

質問に追加されました。ファイル名はUTF8です。あなたはそれで動作する実装を知っていますか、またはこれのためのブーストコンポーネントがあるかどうか? – Flamefire

+0

@Flamefire:私の回答を更新しました –

+0

ありがとう!ライブラリのboost:nowideは 'iofstream'クラスを提供するので便利です。 Pathieはおそらくすべてのboost :: filesystemのものを置き換えることができますが、私はむしろそれらを補完したいと思います。あるいはどちらかのコメント/経験がありますか? – Flamefire

関連する問題