我可以打開ifstream
(或以任何方式設置現有的文件)以僅讀取文件的一部分嗎?例如,我想讓我的ifstream
從字節10到50讀取一個文件。尋求位置0將是實際位置10,讀取過去的位置40(現實中爲50)將會在EOF
等中重現。這是可能的以任何方式?使用iostreams讀取文件的一部分
6
A
回答
7
它可以通過實現一個過濾流緩衝區來完成:你將從std::streambuf
派生出來,並將你想要暴露的範圍和基礎流緩衝區(以及指向它的指針)作爲參數。然後你會尋找到開始的位置。被覆蓋的underflow()
函數將從基礎流緩衝區讀入其緩衝區,直到消耗了所需字符數量爲止。這是一個有點粗糙,完全未經測試的版本:
#include <streambuf>
struct rangebuf: std::streambuf {
rangebuf(std::streampos start,
size_t size,
std::streambuf* sbuf):
size_(size), sbuf_(sbuf)
{
sbuf->seekpos(start, std::ios_base::in);
}
int underflow() {
size_t r(this->sbuf_->sgetn(this->buf_,
std::min<size_t>(sizeof(this->buf_), this->size_));
this->size -= r;
this->setg(this->buf_, this->buf_, this->buf_ + r);
return this->gptr() == this->egptr()
? traits_type::eof()
: traits_type::to_int_type(*this->gptr());
}
size_t size_;
std::streambuf* sbuf_;
};
您可以使用指針來此流緩衝區的一個實例來initialuze的std::istream
。如果這是反覆出現的需求,則可能需要創建一個從std::istream
派生的類,而不是設置流緩衝區。
4
你可以將你想要的字節讀入字符串或字符數組,然後你可以使用該字符串和istringstream,並使用它來代替你的ifstream。例如:
std::ifstream fin("foo.txt");
fin.seekg(10);
char buffer[41];
fin.read(buffer, 40);
buffer[40] = 0;
std::istringstream iss(buffer);
for (std::string s; iss >> s;) std::cout << s << '\n';
如果你需要處理的二進制文件,你也可以這樣做:
std::ifstream fin("foo.bin", std::ios::binary | std::ios::in);
fin.seekg(10);
char buffer[40];
fin.read(buffer, 40);
std::istringstream(std::string(buffer, buffer+40));
2
你可能想實現自己的流讀取器類(最好是通過一些ifstream的接口如果存在的話) 。
相關問題
- 1. 用PHP讀取文件的一部分
- 2. 使Android XML讀取器僅讀取XML文件的一部分
- 3. 使用boost :: iostreams提取壓縮文件
- 4. 讀取csv文件的一部分
- 5. MsBuild:使用ReadLinesFromFile讀取文件的一部分
- 6. 使用HTTP讀取文件的第一部分
- 7. 使用fread將文件的一部分讀取到緩衝區
- 8. 如何使用Boost IOStreams的Gzip文件界面逐行閱讀?
- 9. 使用boost :: iostreams和zlib讀取.gz文件的運行時錯誤
- 10. 使用numpy.genfromtxt()讀取CSV文件 - 分隔符作爲行名稱的一部分
- 11. 文本文件讀取錯誤(部分)
- 12. 部分讀取文本文件
- 13. 從外部配置文件中讀取appSettings的一部分
- 14. 用C++讀取txt文件的一部分
- 15. 如何用numpy讀取二進制文件的一部分?
- 16. 使用PHP讀取部分文本文件
- 17. 如何使用numpy讀取文件的不同部分或塊
- 18. 如何使用tcl讀取文件的每個部分?
- 19. 可以提升iostreams即時讀取和壓縮gzip文件嗎?
- 20. Java:讀取文本文件的一部分
- 21. 如何跳過文件的一部分然後讀取一行?
- 22. 使用批處理文件提取文件名的一部分
- 23. 閱讀C中文件的一部分
- 24. 只讀文件中的一個部分
- 25. 文件閱讀:獲取部分輸出
- 26. 批量讀取部分xml文件
- 27. 使用TextIO讀取外部文件
- 28. 使用GlassFish/Vaadin讀取外部文件?
- 29. 使用javascript ajax讀取外部文件
- 30. 讀取文件時使用分隔符
應該指出的是,這個解決方案只適用於文本文件。 –
@KhaledNassar:它可以很容易地適應二進制文件。完成。 –
這種方法的一個問題是要閱讀的範圍可能相當大。當然,如果它確實是巨大的,那麼無論如何你都可能想要分開處理這個範圍。 –