使用 gzip 编写 gzip 文件
Write gzipped file using gzip
有一个函数需要 FILE*
来序列化对象。
此外,我想以 gzip 格式序列化对象。
为此,我尝试了这个:
boost::shared_ptr<FILE>
openForWriting(const std::string& fileName)
{
boost::shared_ptr<FILE> f(popen(("gzip > " + fileName).c_str(), "wb"), pclose);
return f;
}
boost::shared_ptr<FILE> f = openForWriting(path);
serilizeUsingFILE(f.get());
但是这种方法会导致段错误。
你能帮我了解段错误的原因吗?
你有几个问题。
首先,如果你传递 NULL,pclose 将出现段错误。因此,在构造 shared_ptr.
之前,您需要从 popen 测试 null
其次,popen 没有将 'b' 作为标志,因此类型字符串应该只是 "w".
boost::shared_ptr<FILE>
openForWriting(const std::string& fileName)
{
FILE *g = popen(("gzip >" + fileName).c_str(), "w");
if (!g)
return boost::shared_ptr<FILE>();
boost::shared_ptr<FILE> f(g, pclose);
return f;
}
有一个函数需要 FILE*
来序列化对象。
此外,我想以 gzip 格式序列化对象。
为此,我尝试了这个:
boost::shared_ptr<FILE>
openForWriting(const std::string& fileName)
{
boost::shared_ptr<FILE> f(popen(("gzip > " + fileName).c_str(), "wb"), pclose);
return f;
}
boost::shared_ptr<FILE> f = openForWriting(path);
serilizeUsingFILE(f.get());
但是这种方法会导致段错误。
你能帮我了解段错误的原因吗?
你有几个问题。
首先,如果你传递 NULL,pclose 将出现段错误。因此,在构造 shared_ptr.
之前,您需要从 popen 测试 null其次,popen 没有将 'b' 作为标志,因此类型字符串应该只是 "w".
boost::shared_ptr<FILE>
openForWriting(const std::string& fileName)
{
FILE *g = popen(("gzip >" + fileName).c_str(), "w");
if (!g)
return boost::shared_ptr<FILE>();
boost::shared_ptr<FILE> f(g, pclose);
return f;
}