我从the site下载了源代码并构建了它,但是当我运行测试时,所有压缩文件都有CR + LF行结尾而不仅仅是LF,这使得解压缩的文件与原始文件不同。
我正在查看源代码,但似乎他们已经在二进制模式下打开文件了:
gzstreambuf* gzstreambuf::open( const char* name, int open_mode) {
if ( is_open())
return (gzstreambuf*)0;
mode = open_mode;
// no append nor read/write mode
if ((mode & std::ios::ate) || (mode & std::ios::app)
|| ((mode & std::ios::in) && (mode & std::ios::out)))
return (gzstreambuf*)0;
char fmode[10];
char* fmodeptr = fmode;
if ( mode & std::ios::in)
*fmodeptr++ = 'r';
else if ( mode & std::ios::out)
*fmodeptr++ = 'w';
*fmodeptr++ = 'b';
*fmodeptr = '\0';
file = gzopen( name, fmode);
if (file == 0)
return (gzstreambuf*)0;
opened = 1;
return this;
}
我真的很想使用这段代码,因为它看起来很干净,并且在mingw gcc上毫不费力地编译。唯一的问题是这个棘手的业务,如果我能找到解决方案,我可以让它滑动。
答案 0 :(得分:2)
我已经成功实施了我的解决方法。虽然gzstream看起来不错,但我还是写了一些直接使用zlib的代码。事实证明它完全不错 因为zlib隐藏了那里的助手,而且zlib.h
本身也有很多有用的评论。
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen));
很简单。
当然,假的0x0D
回车字符不再存在问题!
答案 1 :(得分:1)
std :: ios :: binary ??
在哪里在UNIX平台上,它通常是不必要的,因此有些人在不应该这样做时省略它。