Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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+中的压缩二进制文件+;_C++_Binaryfiles - Fatal编程技术网

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

C++ 读取C+中的压缩二进制文件+;,c++,binaryfiles,C++,Binaryfiles,我曾经使用popen((“zcat”+filename).c_str(),“r”)来读取压缩文本文件。不过,这次我需要读取压缩的二进制文件。我尝试了popen(((“zcat”+filename).c_str(),“rb”),但失败了,因为即使文件确实存在,返回值也是NULL 我能知道为什么这条路不通吗?我可以保证文件名是正确定义的,没有特殊字符,文件确实存在。当我阅读压缩的文本文件时,类似的方法也适用 我可以知道正确的方法是什么吗?“rb”不是popen的有效模式。如果你阅读,你会看到上面写着

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

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

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

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

[……]

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

[……]

如果你看,它说(关于模式字符串):

字符
'b'
应无效,但允许符合ISO C标准

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


如果您决定使用zlib而不是
popen(“zcat”),那么,…
(正如其他人所建议的,我可能会推荐)有很多很好的文档,我个人认为演示非常有用。

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

[……]

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

[……]

如果你看,它说(关于模式字符串):

字符
'b'
应无效,但允许符合ISO C标准

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



如果您决定使用zlib而不是
popen(“zcat”,…)
(正如其他人建议的,我也可能建议的那样),那么有很多很好的文档,我个人认为演示非常有用。

为什么不使用合适的Zip库而不是依赖管道呢?在命令行末尾粉碎文件名是错误的,它无法处理包含空格或不规则字符的文件名,因此如果可以避免这样做,请务必避免。您好@tadman,问题是我们希望避免安装更多库。如果我们没有库也能做到这一点,那就太好了。你的目标是什么操作系统?许多人已经安装了某种库,如果您可以构建一个内部静态链接库的可执行文件,那么这不是问题。与其使用任意的shell命令,不如依赖一个库。这段代码允许人们在控制文件名的情况下执行任意shell命令,这是非常糟糕的。这有什么问题?@JerryChou“不使用库的另一个原因是因为旧代码没有。一段糟糕的代码无论有多旧或“传统”都是不好的。最好隔离在函数/方法/接口中读取zip的方式,并重新访问/重构旧代码以调用它。以后,如果您想更改“存档读取提供程序”,只需在一个位置进行更改。为什么不使用适当的Zip库而不是依赖管道?在命令行末尾粉碎文件名是错误的,它无法处理包含空格或不规则字符的文件名,因此如果可以避免这样做,请务必避免。您好@tadman,问题是我们希望避免安装更多库。如果我们没有库也能做到这一点,那就太好了。你的目标是什么操作系统?许多人已经安装了某种库,如果您可以构建一个内部静态链接库的可执行文件,那么这不是问题。与其使用任意的shell命令,不如依赖一个库。这段代码允许人们在控制文件名的情况下执行任意shell命令,这是非常糟糕的。这有什么问题?@JerryChou“不使用库的另一个原因是因为旧代码没有。一段糟糕的代码无论有多旧或“传统”都是不好的。最好隔离在函数/方法/接口中读取zip的方式,并重新访问/重构旧代码以调用它。以后,如果您想更改“存档读取提供程序”,只需在一个位置进行更改。那么是否仍可以使用popen来满足我的需要?是的。我刚刚更新了我的答案来谈论这一点。在Linux(和其他POSIX系统)中,
popen
中的
FILE*
句柄始终处于二进制模式,因此您不必担心调用
popen
时会指定它。因此,是否仍然可以使用popen满足我的需要?是的。我刚刚更新了我的答案来谈论这一点。在Linux(和其他POSIX系统)中,
popen
中的
FILE*
句柄始终处于二进制模式,因此您无需担心调用
popen
时指定该句柄。
FILE *popen(const char *command, const char *type);