1. ホーム
  2. c++

std::fstreamからFILE*を取得する

2023-11-04 20:56:12

質問

C++のstd::fstreamからCのFILE*ハンドルを取得する(クロスプラットフォーム)方法はあるのでしょうか?

私が尋ねる理由は、私の C++ ライブラリは fstream を受け入れ、ある特定の関数で FILE* を受け入れる C ライブラリを使用したいからです。

どのように解決するのですか?

簡単に言うと、「いいえ」です。

その理由は std::fstream を使用する必要がないためです。 FILE* をその実装の一部として使用する必要はありません。そのため、ファイルディスクリプタをなんとか取り出したとしても std::fstream オブジェクトからファイル記述子を抽出し、手動で FILE オブジェクトを構築したとしても、同じファイル記述子に対して書き込む 2 つのバッファード オブジェクトを持つことになるため、別の問題が発生します。

本当の疑問は、なぜ std::fstream オブジェクトを FILE* ?

あまりお勧めはしませんが、このように funopen() .

残念ながら、これは ではなく POSIX API ではないので (BSD 拡張です)、その移植性には疑問があります。そのため、移植性に問題があります。 std::stream をこのようなオブジェクトでラップしている人がいないのもそのためでしょう。

FILE *funopen(
              const void *cookie,
              int    (*readfn )(void *, char *, int),
              int    (*writefn)(void *, const char *, int),
              fpos_t (*seekfn) (void *, fpos_t, int),
              int    (*closefn)(void *)
             );

これによって FILE オブジェクトを構築し、実際の作業に使用されるいくつかの関数を指定します。適切な関数を書けば、その関数に std::fstream オブジェクトから読み込むようにすることができます。