fopen android ndk,将FILE *转换为ifstream C,Android NDK

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值