将 std::filebuf 限制为(存档)文件内的文件

Limit std::filebuf to file inside (archive) file

本文关键字:文件 存档 std filebuf      更新时间:2023-10-16

我目前正在实现一个自定义std::filebuf,它从未压缩的.zip档案中读取文件。对于存档中的每个文件,我都有存档文件的偏移量和大小。现在我想将 filebuf 限制为间隔[offset, offset+size],以便我可以像打开普通文件一样使用pubseekoff()等函数。例如,当我pubseekoff(5, std::ios::beg, std::ios::in); filebuf 实际上应该将其底层获取指针设置为存档文件中的offset+5

实现这一点的最佳方法是什么?我试图从std::filebuf派生并覆盖 seekoff() 等函数来执行本地文件偏移量 ->存档文件偏移转换,但这不起作用,因为底层 filebuf(对我的存档偏移一无所知)调用这些函数并抛出 eof 错误等。我还尝试从 std::streambuf生并在我的 streambif 中使用std::filebuf,但这也没有奏效,因为std::streambuf中的大多数成员都受到保护。我可以在我的 streambuf 中使用std::ifstream,但这似乎很麻烦。

我最终从头开始重写了一个 streambuf。它使用 C 样式 fopen()、fread() 等函数。该代码没有经过很好的测试(无论是正确性还是性能),但它对我有用:

http://pastebin.com/Bt4rh0mu