簡體   English   中英

將FILE *轉換為ifstream C ++,Android NDK

[英]Convert FILE* to 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);

我只輸入上面的代碼,目前我無法嘗試。 然而,基本應該是正確的,雖然可能有類型,甚至可能有一點缺陷。

注意,沒有辦法檢索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以實現所需的工作之外std::streambuf他法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM