google::protobuf::io::GzipOutputStream 如果文件句柄最后关闭,则不写入任何内容
google::protobuf::io::GzipOutputStream does not write anything if the file handle is closed at the end
以下代码按预期写入文件
int ofd = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0777);
google::protobuf::io::FileOutputStream outp(ofd);
google::protobuf::io::GzipOutputStream fout(&outp);
MyMessage msg;
ConstructMessage(&msg);
CHECK(google::protobuf::util::SerializeDelimitedToZeroCopyStream(msg, &fout));
fout.Close();
// close(ofd);
但是,如果我取消注释最后一行 // close(ofd);
,我得到的是空文件。这是为什么?
此外,如果我跳过使用 Gzip 包装器,最后一行也没有问题。这看起来像是一个错误吗?
您应该按照打开的相反顺序关闭:
int ofd = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0777);
google::protobuf::io::FileOutputStream outp(ofd);
google::protobuf::io::GzipOutputStream fout(&outp);
...
fout.Close();
outp.Close();
close(ofd);
缺少 outp.Close();
,一些数据可能会保留在其中缓冲。析构函数最终会将其清除,但此时 ofd
已经关闭,因此没有可写入的内容。
以下代码按预期写入文件
int ofd = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0777);
google::protobuf::io::FileOutputStream outp(ofd);
google::protobuf::io::GzipOutputStream fout(&outp);
MyMessage msg;
ConstructMessage(&msg);
CHECK(google::protobuf::util::SerializeDelimitedToZeroCopyStream(msg, &fout));
fout.Close();
// close(ofd);
但是,如果我取消注释最后一行 // close(ofd);
,我得到的是空文件。这是为什么?
此外,如果我跳过使用 Gzip 包装器,最后一行也没有问题。这看起来像是一个错误吗?
您应该按照打开的相反顺序关闭:
int ofd = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0777);
google::protobuf::io::FileOutputStream outp(ofd);
google::protobuf::io::GzipOutputStream fout(&outp);
...
fout.Close();
outp.Close();
close(ofd);
缺少 outp.Close();
,一些数据可能会保留在其中缓冲。析构函数最终会将其清除,但此时 ofd
已经关闭,因此没有可写入的内容。