2014-01-24 53 views
0

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

回答

1

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

+0

這對我有用。問題是由於緩衝區大小? – Capt

2

你構建從content爲std :: string瞞着構造它有多長,所以構造函數是怎麼回事,直到它找到一個終止NUL從緩衝區的開始閱讀。但是不能保證該文件包含一個,因此構造函數會讀取緩衝區的末尾,直到碰巧找到NUL。

修復:使用雙參數std :: string構造函數(string(const char* s, size_t size))並傳遞它的數據長度。

+0

它仍然發生。在內容結尾我仍然會看到垃圾。檢查文件和附加的數據不存在,所以zip_fread必須做錯了。 – ruipacheco