Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C+中使用fopen(或与fopen具有相同返回值的函数)打开gzip文件+;?_C++_Compression_Gzip_Fopen - Fatal编程技术网

C++ 如何在C+中使用fopen(或与fopen具有相同返回值的函数)打开gzip文件+;?

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,也就是说,它应该返回一个指向文件对象的指针,这样剩下的代码就不

我目前有一些未压缩的代码读取文件,它使用以下方法读取C中的文件++

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>——即使您现在不这样做,我也会把它作为一个“需要最终修复的维护缺陷”来提高。流接口有很多帮助的方法——如果您愿意,您甚至可以编写一个在
文件*
上运行的流接口。