我正在编写一个带有NDK C组件的Android项目,并且有一个需要大量解析的文件. NDK只允许我获取一个指向我正在处理的文件的FILE *指针,而不是一个ifstream,它有一些与之相关的便利功能.无论如何将FILE *(cstdio)转换为ifstream(iostream)?
解决方法:
通常,您不能将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);
我只输入上面的代码,目前我无法尝试.然而,基本应该是正确的,虽然可能有类型,甚至可能有一点缺陷.
标签:android,c,android-ndk,file
来源: https://codeday.me/bug/20190725/1537461.html