我使用NDK C++組件編寫Android項目,並且需要大量解析的文件。 NDK只允許我獲得一個指向我正在處理的文件的FILE *指針,而不是具有與其相關的更多便利功能的ifstream。反正有沒有將FILE *(cstdio)轉換爲ifstream(iostream)?將FILE *轉換爲ifstream C++,Android NDK
回答
請注意,沒有辦法檢索std::ifstream
,但您可以得到std::istream
。
儘管不是標準C++的一部分,但有時std::basic_filebuf
通過constructor which takes std::FILE *
公開了擴展。
basic_filebuf(FILE *fp, char_type *buf = 0, streamsize n = /* default size */);
Constructs an object of class
basic_filebuf
, initializing the base class withbasic_streambuf<charT,traits>()
. It then callsopen(fp, buf, n)
.
你應該使用這是如下的方式......
FILE *pf = ...; /* e.g. fopen("/etc/passwd", "r") */
std::filebuf buf(pf);
std::istream stream(&buf);
現在,如果這種擴展是不可用,那麼恐怕沒有太多可以做其他的不是嘗試實施您自己的std::streambuf
,實現所需的工作。
一般而言,您可以將而不是轉換爲FILE*
爲std::ifstream
。然而,這並不是真的有必要:創建一個自定義流緩衝區可以用來初始化一個std::istream
是合理的直接。使用std::istream
應該足夠了,因爲std::ifstream
提供的額外功能無論如何都不能真正幫助解析。只要你不需要使用seek,創建一個用於從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);
我剛纔輸入上面的代碼,目前我不能試試看。然而,基本的內容應該是正確的,儘管可能有類型,甚至可能有一些缺陷。
這需要一個小修改第三個參數'size'在this-> setg()應該是'this-> d_buffer + size' –
@BostonWalker:fixed。謝謝! –
- 1. 將ifstream轉換爲istream
- 2. Android NDK:將.jpg轉換爲.bmp文件
- 3. C將struct dirent *轉換爲FILE *
- 4. C++ - 轉換FILE *爲char *
- 5. 將QFile轉換爲FILE *
- 6. 從ifstream的*轉換爲ifstream的&
- 7. 如何將shared_ptr <FILE>轉換爲C++中的FILE *文件?
- 8. C++:無法從'std :: ifstream'轉換爲'char *'
- 9. 如何轉換C++代碼爲NDK?
- 10. 如何將ifstream轉換爲istream
- 11. 將圖像URI轉換爲File對象
- 12. 將android的代碼轉換爲android的NDK
- 13. 將byte []轉換爲Java中的Object File
- 14. 如何將PIL`Image`轉換爲Django`File`?
- 15. 將std :: filebuf(FILE *)轉換爲使用libC++
- 16. (android ndk)庫的libyuv將argb轉換爲nv21(yuv420sp)的用法?
- 17. Android NDK/General JNI問題:將對象/ jobject轉換爲C++用戶defiend類型
- 18. 將C#代碼轉換爲Android
- 19. 如何將一個字符串轉換爲ifstream
- 20. 將c#RSACryptoServiceProvider轉換爲C++
- 21. 將QT/C++轉換爲C#
- 22. 將C++轉換爲objective-c
- 23. 將C++/CLI轉換爲C#
- 24. Android的C++ NDK
- 25. Android使用C(ndk)
- 26. 在Android中將RGBA轉換爲ARGB_8888
- 27. fileno轉換FILE描述符C
- 28. std :: ifstream/FILE *可以改變大小嗎?
- 29. ifstream等效於FILE *的倒回方法
- 30. 如何將ifstream或字符串輸入轉換爲char?
我試圖用你的代碼的第二部分,但我得到的錯誤: 文件:對於調用「的std :: basic_filebuf :: basic_filebuf(FILE *)」 -----代碼沒有匹配功能* fp = fopen(「./ Output_BinaryImage.pgm」,「r」); std :: filebuf buf(fp); std :: istream流(&buf); –
inblueswithu
@inblueswithu完全讀我的帖子 - 我解決了這個錯誤,它是'std :: filebuf'的一個非標準擴展 – oldrinb