C++ 如何在C+中使用fopen(或与fopen具有相同返回值的函数)打开gzip文件+;?
我目前有一些未压缩的代码读取文件,它使用以下方法读取C中的文件++C++ 如何在C+中使用fopen(或与fopen具有相同返回值的函数)打开gzip文件+;?,c++,compression,gzip,fopen,C++,Compression,Gzip,Fopen,我目前有一些未压缩的代码读取文件,它使用以下方法读取C中的文件++ FILE* id = fopen("myfile.dat", "r"); 获得id后,代码的不同部分使用fread、fseek等访问文件 我想修改我的代码,以便在不需要太多更改的情况下打开文件的gzip版本,例如“myfile.dat.gz” 理想情况下,我会实现一个fopen的包装器,称之为fopen2,它可以读取myfile.dat和myfile.dat.gz,也就是说,它应该返回一个指向文件对象的指针,这样剩下的代码就不
FILE* id = fopen("myfile.dat", "r");
获得id后,代码的不同部分使用fread、fseek等访问文件
我想修改我的代码,以便在不需要太多更改的情况下打开文件的gzip版本,例如“myfile.dat.gz”
理想情况下,我会实现一个fopen的包装器,称之为fopen2,它可以读取myfile.dat和myfile.dat.gz,也就是说,它应该返回一个指向文件对象的指针,这样剩下的代码就不需要更改了
有什么建议吗
多谢各位
PS:如果这种方法提供了一种解决方案,则可以在内存中解压整个文件。提供了类似于
fopen()
,fread()
,等等的方法,称为gzip()
,gzread()
,用于读取和写入gzip文件。如果文件不是gzip压缩的,它将像f
函数一样被读取。因此,您只需要更改zlib中的函数名和链接。我想您正在寻找。您可以使用它来进行解压缩业务。使用文件*
不起作用,至少不可移植。如果您使用了IOStreams,那么就有可能创建一个包装器(我没有太仔细地研究zlib的seeking接口)。从第一眼看,最可移植的解决方案似乎是使用zlib创建一个新的临时未压缩文件,将其存储在某个地方,然后使用遗留代码读取它,最后删除临时文件。看起来开销很大。。。我希望找到一个更便携的解决方案…谷歌“c++iostream gzip解压缩过滤器”。Boost确实做得很好。您可能应该考虑重新编写该函数的接口,以便它使用<代码>流>代码>而不是<代码>文件*/COD>——即使您现在不这样做,我也会把它作为一个“需要最终修复的维护缺陷”来提高。流接口有很多帮助的方法——如果您愿意,您甚至可以编写一个在文件*
上运行的流接口。