将FILE *转换为ifstream C,Android NDK

将FILE *转换为ifstream C,Android NDK,第1张

概述我正在编写一个带有NDKC组件的Android项目,并且有一个需要大量解析的文件.NDK只允许我获取一个指向我正在处理的文件的FILE*指针,而不是一个ifstream,它有一些与之相关的便利功能.无论如何将FILE*(cstdio)转换为ifstream(iostream)?解决方法:通常,您不能将FILE*转换为std::if

我正在编写一个带有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);

我只输入上面的代码,目前我无法尝试.然而,基本应该是正确的,虽然可能有类型,甚至可能有一点缺陷.

总结

以上是内存溢出为你收集整理的将FILE *转换为ifstream C,Android NDK全部内容,希望文章能够帮你解决将FILE *转换为ifstream C,Android NDK所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1114409.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存