gpt4 book ai didi

c++ - 从压缩文件中提取数据返回随机数据

转载 作者:行者123 更新时间:2023-11-28 00:34:55 24 4
gpt4 key购买 nike

我正在使用 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);
}

最佳答案

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

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

关于c++ - 从压缩文件中提取数据返回随机数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21334211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com