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 已经关闭,因此没有可写入的内容。