Я в настоящее время внедряю кастом std::filebuf
который читает файлы из несжатых .zip архивов. Для каждого файла в архиве у меня есть смещение в файл архива и размер. Теперь я хочу ограничить filebuf интервалом [offset, offset+size]
так что я могу использовать такие функции, как pubseekoff()
как будто я открыл нормальный файл. Например, когда я делаю pubseekoff(5, std::ios::beg, std::ios::in);
filebuf должен на самом деле установить свой основной указатель get на offset+5
в архивном файле.
Каков наилучший способ реализации этого? Я пытался извлечь из std::filebuf
и переопределить функции, такие как seekoff()
сделать локальное смещение файла -> преобразования смещения архивного файла, но это не сработало, так как базовый filebuf (который ничего не знает о моих смещениях архива) вызывает эти функции и выдает eof ошибки и тому подобное. Я также пытался извлечь из std::streambuf
а также использование std::filebuf
внутри моего streambuf, но это также не сработало, так как большинство членов std::streambuf
защищены я мог использовать std::ifstream
в моем потоке, но это кажется громоздким.
Я закончил тем, что переписал streambuf с нуля. Он использует функции C-Style fopen (), fread () и т. Д. Код не очень хорошо протестирован (ни на корректность, ни на производительность), но он работает для меня:
Других решений пока нет …