NDK C++ コンポーネントを使用して Android プロジェクトをコーディングしていて、多くの解析が必要なファイルがあります。NDK では、処理しているファイルへの FILE* ポインターのみを取得できます。それに関連するいくつかの便利な関数を持つ ifstream は取得できません。FILE* (cstdio) を ifstream (iostream) に変換する方法はありますか?
2 に答える
一般に、 を に変換することはできません。ただし、とにかくこれは本当に必要というわけではありません。とにかく、によって提供される追加機能は実際には解析に役立たないため、を使用するだけで十分です。シークを使用する必要がない限り、から読み取るためのストリーム バッファーを作成するのは非常に簡単です。関数をオーバーライドするだけです。FILE*
std::ifstream
std::istream
std::istream
std::ifstream
FILE*
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);
上記のコードを入力したところ、現在は試すことができません。ただし、基本は正しいはずですが、種類やわずかな欠陥がある場合もあります。
を取得する方法はありませんが、を取得する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
、必要な作業を実装する独自の拡張機能を実装する以外にできることはほとんどないのではないかと思います。