91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++處理ZIP文件技巧

發布時間:2024-10-30 10:42:37 來源:億速云 閱讀:80 作者:小樊 欄目:編程語言

在C++中處理ZIP文件,可以使用一些第三方庫,如minizipzlib。這些庫可以幫助你輕松地讀取、寫入和操作ZIP文件。下面是一些使用這些庫處理ZIP文件的技巧:

  1. 使用minizip庫讀取ZIP文件:
#include <iostream>
#include <zip.h>
#include <unzip.h>
#include <vector>

int main() {
    unzFile uf = unzOpen("example.zip");
    if (uf == NULL) {
        std::cerr << "Error opening ZIP file" << std::endl;
        return 1;
    }

    unz_global_info gi;
    if (unzGetGlobalInfo(uf, &gi) != UNZ_OK) {
        std::cerr << "Error getting global info" << std::endl;
        unzClose(uf);
        return 1;
    }

    std::vector<char> buf(gi.total_out);
    unz_file_info fi;
    int ret;

    for (unsigned int i = 0; i < gi.num_files; ++i) {
        ret = unzGetCurrentFileInfo(uf, &fi, NULL, 0, NULL, 0, NULL, 0);
        if (ret != UNZ_OK) {
            std::cerr << "Error getting file info" << std::endl;
            continue;
        }

        std::vector<char> filename(fi.filename, fi.filename + fi.filename_length);
        std::vector<char> file_content(buf.size());

        ret = unzOpenCurrentFile(uf, &file_content[0]);
        if (ret != UNZ_OK) {
            std::cerr << "Error opening current file" << std::endl;
            continue;
        }

        unzReadCurrentFile(uf, &file_content[0], file_content.size());
        unzCloseCurrentFile(uf);

        std::cout << "Filename: " << filename << std::endl;
        std::cout << "Size: " << fi.uncompressed_size << std::endl;
        std::cout << "Content: " << std::string(file_content.begin(), file_content.end()) << std::endl;
    }

    unzClose(uf);
    return 0;
}
  1. 使用minizip庫向ZIP文件添加文件:
#include <iostream>
#include <zip.h>
#include <unzip.h>
#include <vector>

int main() {
    unzFile uf = unzOpen("example.zip");
    if (uf == NULL) {
        std::cerr << "Error opening ZIP file" << std::endl;
        return 1;
    }

    int ret = unzGoToFirstFile(uf);
    if (ret != UNZ_OK) {
        std::cerr << "Error going to first file" << std::endl;
        unzClose(uf);
        return 1;
    }

    const char* filename = "newfile.txt";
    const char* content = "This is the content of the new file.";
    size_t content_size = strlen(content);

    unz_file_info fi;
    ret = unzGetCurrentFileInfo(uf, &fi, NULL, 0, NULL, 0, NULL, 0);
    if (ret != UNZ_OK) {
        std::cerr << "Error getting current file info" << std::endl;
        unzClose(uf);
        return 1;
    }

    unz_file_info new_fi;
    ret = unzOpenCurrentFile(uf, &new_fi);
    if (ret != UNZ_OK) {
        std::cerr << "Error opening current file" << std::endl;
        unzClose(uf);
        return 1;
    }

    ret = unzWriteCurrentFile(uf, content, content_size);
    if (ret != UNZ_OK) {
        std::cerr << "Error writing current file" << std::endl;
        unzCloseCurrentFile(uf);
        unzClose(uf);
        return 1;
    }

    unzCloseCurrentFile(uf);
    unzClose(uf);
    return 0;
}
  1. 使用zlib庫壓縮和解壓縮數據:
#include <iostream>
#include <vector>
#include <zlib.h>

std::vector<char> compressData(const std::vector<char>& data) {
    z_stream zs;
    zs.zalloc = Z_NULL;
    zs.zfree = Z_NULL;
    zs.opaque = Z_NULL;
    zs.avail_in = data.size();
    zs.next_in = reinterpret_cast<Bytef*>(data.data());

    int ret = deflateInit(&zs, Z_DEFAULT_COMPRESSION);
    if (ret != Z_OK) {
        std::cerr << "Error initializing compression" << std::endl;
        return {};
    }

    std::vector<char> compressed_data;
    compressed_data.reserve(data.size() * 2);

    do {
        zs.avail_out = compressed_data.size();
        zs.next_out = reinterpret_cast<Bytef*>(compressed_data.data() + compressed_data.size());

        ret = deflate(&zs, Z_FINISH);
        if (ret != Z_STREAM_END && ret != Z_OK) {
            std::cerr << "Error compressing data" << std::endl;
            deflateEnd(&zs);
            return {};
        }

        compressed_data.resize(compressed_data.size() + zs.avail_out);
    } while (zs.avail_out == 0);

    deflateEnd(&zs);
    return compressed_data;
}

std::vector<char> decompressData(const std::vector<char>& data) {
    z_stream zs;
    zs.zalloc = Z_NULL;
    zs.zfree = Z_NULL;
    zs.opaque = Z_NULL;
    zs.avail_in = data.size();
    zs.next_in = reinterpret_cast<Bytef*>(data.data());

    int ret = inflateInit(&zs);
    if (ret != Z_OK) {
        std::cerr << "Error initializing decompression" << std::endl;
        return {};
    }

    std::vector<char> decompressed_data;
    decompressed_data.reserve(data.size() * 2);

    do {
        zs.avail_out = decompressed_data.size();
        zs.next_out = reinterpret_cast<Bytef*>(decompressed_data.data() + decompressed_data.size());

        ret = inflate(&zs, Z_NO_FLUSH);
        if (ret != Z_STREAM_END && ret != Z_OK) {
            std::cerr << "Error decompressing data" << std::endl;
            inflateEnd(&zs);
            return {};
        }

        decompressed_data.resize(decompressed_data.size() + zs.avail_out);
    } while (zs.avail_out == 0);

    inflateEnd(&zs);
    return decompressed_data;
}

這些示例展示了如何使用minizip庫讀取ZIP文件、向ZIP文件添加文件以及使用zlib庫壓縮和解壓縮數據。你可以根據自己的需求對這些示例進行修改和擴展。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

神木县| 阜康市| 内丘县| 贺兰县| 五指山市| 柳河县| 金川县| 奉新县| 满洲里市| 朝阳县| 澄江县| 武冈市| 乐东| 西平县| 富蕴县| 平度市| 田阳县| 乌审旗| 进贤县| 沁阳市| 伊通| 泊头市| 新乡市| 南乐县| 威远县| 吉安县| 赤壁市| 保康县| 清流县| 扶余县| 大悟县| 徐汇区| 平潭县| 大名县| 康保县| 于田县| 太康县| 平阴县| 平顺县| 温泉县| 浦东新区|