【发布时间】:2013-02-26 14:25:35
【问题描述】:
我一直在尝试压缩字符串并将它们保存到文本文件中,然后读取数据并解压缩。然而,当我尝试解压缩读取的字符串时,我得到一个 Z_BUF_ERROR (-5) 并且该字符串可能会或可能不会解压缩。
在控制台,我可以整天压缩/解压:
std::string s = zlib_compress("HELLO asdfasdf asdf asdfasd f asd f asd f awefo@8 892y*(@Y");
std::string e = zlib_decompress(s);
字符串e 将毫无困难地返回原始字符串。
但是,当我这样做时:
zlib_decompress(readFile(filename));
我收到了Z_BUF_ERROR。我认为这可能部分是由于文件中的隐藏字符,但我不太确定。
这是我的readFile 函数:
std::string readFile(std::string filename)
{
std::ifstream file;
file.open(filename.c_str(), std::ios::binary);
file.seekg (0, std::ios::end);
int length = file.tellg();
file.seekg (0, std::ios::beg);
char * buffer = new char[length];
file.read(buffer, length);
file.close();
std::string data(buffer);
return data;
}
当我写压缩数据时,我使用:
void writeFile(std::string filename, std::string data)
{
std::ofstream file;
file.open(filename.c_str(), std::ios::binary);
file << data;
file.close();
}
如果需要,我会展示我用来解压/压缩的函数,但如果它在没有文件 IO 的情况下工作,我觉得问题是一个 IO 问题。
【问题讨论】:
-
您正在阅读的文件有多长?塞维拉MB?还是就像您使用的字符串一样?
-
虽然我没有立即明白为什么您的代码不能按预期工作,但我相信我看到了内存泄漏:
readFile()中的buffer永远不会被释放。 -
@ahans 哇。谢谢。我没注意到。
-
最好完全摆脱手动分配的缓冲区。您可以使用
vector<char> buf,然后将&buf[0]传递给file.read。或者查看这个问题的公认答案:stackoverflow.com/questions/1816319/… -
zlib_compress和zlib_decompress函数在做什么,你能提供一些源代码吗?它们不是来自原始 zlib。
标签: c++ string file compression zlib