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

时间:2016-10-31 02:12:56

标签: c++ binaryfiles

我曾经使用func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { if(velocity.y>0){ if Device.IS_3_5_INCHES() { self.topConstraint.constant = -100 } if Device.IS_4_INCHES() { self.topConstraint.constant = -70 } if Device.IS_4_7_INCHES() { self.topConstraint.constant = 0 } if Device.IS_5_5_INCHES() { self.topConstraint.constant = 0 } }else{ self.topConstraint.constant = 50 } } 来阅读压缩文本文件。但是,这次我需要读取压缩二进制文件。我尝试popen(("zcat " + filename).c_str(), "r")但它失败了,因为返回值为NULL,即使该文件确实存在。

我可以知道为什么失败了吗?我可以保证文件名已正确定义,没有特殊字符,文件确实存在。当我读取压缩文本文件时,类似的方式有效。

我可以知道这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

"rb"不是popen的有效模式。如果您阅读the man page for popen,就会看到它:

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

[...]

     

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

     

[...]

如果你看the POSIX documentation for fopen,它会说(关于模式字符串):

  

字符'b'不起作用,但允许符合ISO C标准。

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

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