在C++中读取压缩的二进制文件

Read zipped binary file in C++

本文关键字:二进制文件 压缩 读取 C++      更新时间:2023-10-16

我曾经使用popen(("zcat " + filename).c_str(), "r")读取压缩文本文件。不过,这次我需要读取压缩的二进制文件。我尝试了popen(("zcat " + filename).c_str(), "rb"),但失败了,因为即使文件确实存在,返回值也是NULL。

我能知道为什么路不通吗?我可以保证文件名定义正确,没有特殊字符,并且文件确实存在。当我阅读压缩文本文件时,类似的方式也会起作用。

我可以知道什么是正确的方法吗?

"rb"不是popen的有效模式。如果你阅读popen的手册页,你会看到上面写着:

FILE *popen(const char *command, const char *type);

[…]

type参数是指向以null结尾的字符串的指针,该字符串必须包含用于读取的字母'r'或用于写入的字母'w'

[…]

如果您查看fopen的POSIX文档,它会说(关于模式字符串(:

字符'b'不应产生任何影响,但允许符合ISO C标准。

因此,在POSIX-ish系统(如Linux(上,打开文件时不需要指定二进制模式,尤其是在使用popen时。从popen返回的任何FILE*都将始终以二进制模式打开。


如果您决定使用zlib而不是popen("zcat", ...)(正如其他人所建议的,我可能会建议的那样(,有很多好的文档,我个人认为zpipe.c演示非常有用。