从压缩文件中提取数据会返回随机数据

时间:2014-01-24 13:40:36

标签: c++ libzip

我正在使用libzip将zip中每个文件的内容提取到我自己的数据结构中,这是一个C ++不可变的POD。

问题在于每次我提取文件的内容时,都会得到一些随机数据。这是我的代码:

void Parser::populateFileMetadata() {
int error = 0;
zip *zip = zip_open(this->file_path.c_str(), 0, &error);
if (zip == nullptr) {
  LOG(DEBUG)<< "Could not open zip file.";
  return;
}

const zip_int64_t n_entries = zip_get_num_entries(zip, ZIP_FL_UNCHANGED);
for (zip_int64_t i = 0; i < n_entries; i++) {
  const char *file_name = zip_get_name(zip, i, ZIP_FL_ENC_GUESS);
  struct zip_stat st;
  zip_stat_init(&st);
  zip_stat(zip, file_name, (ZIP_FL_NOCASE|ZIP_FL_UNCHANGED), &st);
  char *content = new char[st.size];
  zip_file *file = zip_fopen(zip, file_name, \
                             (ZIP_FL_NOCASE|ZIP_FL_UNCHANGED));
  const zip_int64_t did_read = zip_fread(file, content, st.size);
  if (did_read <= 0) {
    LOG(WARNING)<< "Could not read contents of " << file_name << ".";
    continue;
  }
  const FileMetadata metadata(string(file_name), -1, string(content));
  this->file_metadata.push_back(metadata);

  zip_fclose(file);
  delete[] content;
}
zip_close(zip);
}

2 个答案:

答案 0 :(得分:2)

你正在构建一个来自content的std :: string而不告诉构造函数它有多长,所以构造函数将从缓冲区的开头读取,直到它找到一个终止的NUL。但是不能保证文件包含一个,因此构造函数会读取缓冲区的末尾,直到找到NUL为止。

修复:使用双参数std :: string构造函数(string(const char* s, size_t size))并将其传递给数据长度。

答案 1 :(得分:1)

zip_fread似乎会增加content的大小,所以我只是截断contentcontent[st.size] = '\0';