4

NDK C++ コンポーネントを使用して Android プロジェクトをコーディングしていて、多くの解析が必要なファイルがあります。NDK では、処理しているファイルへの FILE* ポインターのみを取得できます。それに関連するいくつかの便利な関数を持つ ifstream は取得できません。FILE* (cstdio) を ifstream (iostream) に変換する方法はありますか?

4

2 に答える 2

5

一般に、 を に変換することはできません。ただし、とにかくこれは本当に必要というわけではありません。とにかく、によって提供される追加機能は実際には解析に役立たないため、を使用するだけで十分です。シークを使用する必要がない限り、から読み取るためのストリーム バッファーを作成するのは非常に簡単です。関数をオーバーライドするだけです。FILE*std::ifstreamstd::istreamstd::istreamstd::ifstreamFILE*std::streambuf::underflow()

class stdiobuf
    : std::streambuf
{
private:
    FILE* d_file;
    char  d_buffer[8192];
public:
    stdiobuf(FILE* file): d_file(file) {}
    ~stdiobuf() { if (this->d_file) fclose(this->d_file); }
    int underflow() {
        if (this->gptr() == this->egptr() && this->d_file) {
            size_t size = fread(this->d_file, 8192);
            this->setg(this->d_buffer, this->d_buffer, this->d_buffer + size);
        }
        return this->gptr() == this->egptr()
            ? traits_type::eof()
            : traits_type::to_int_type(*this->gptr());
    }
};

残っているのは、std::istreamを使用するように を初期化することだけstdiobufです:

stdiobuf     sbuf(fopen(...));
std::istream in(&sbuf);

上記のコードを入力したところ、現在は試すことができません。ただし、基本は正しいはずですが、種類やわずかな欠陥がある場合もあります。

于 2012-09-09T20:45:51.957 に答える
3

を取得する方法はありませんが、を取得するstd::ifstreamことはできますstd::istream

標準のC++の一部ではありませんが、 。を取るコンストラクターをstd::basic_filebuf介して拡張機能を公開することがあります。std::FILE *

basic_filebuf(FILE *fp, char_type *buf = 0, 
              streamsize n = /* default size */);

クラスのオブジェクトを構築しbasic_filebuf、基本クラスを。で初期化しbasic_streambuf<charT,traits>()ます。次に、を呼び出しますopen(fp, buf, n)

これを使用する方法は次のとおりです...

FILE *pf = ...; /* e.g. fopen("/etc/passwd", "r") */
std::filebuf buf(pf);
std::istream stream(&buf);

さて、この拡張機能が利用できない場合はstd::streambuf、必要な作業を実装する独自の拡張機能を実装する以外にできることはほとんどないのではないかと思います。

于 2012-09-09T20:18:29.680 に答える