0

以下代码按预期写入文件

  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 包装器,最后一行不会出现问题。这看起来像一个错误吗?

4

1 回答 1

2

您应该以与打开相反的顺序关闭事物:

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它已经关闭,所以没有什么可写的。

于 2022-02-27T15:44:07.583 回答