📜  如何压缩文件 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:52:11.025000             🧑  作者: Mango

如何压缩文件

在计算机存储空间有限的情况下,文件压缩成为一种非常实用的技术。本文将介绍如何使用 C 语言压缩文件。

压缩算法简介

在介绍如何压缩文件之前,我们需要了解压缩算法的一些基本概念。常用的压缩算法主要有两类:无损压缩和有损压缩。

  • 无损压缩:压缩后的文件与原文件相比,完全还原,不会损失任何信息。
  • 有损压缩:压缩后的文件与原文件相比,会有一定的信息损失。

常用的无损压缩算法有:LZW、Huffman、Arithmetic 等。常用的有损压缩算法有:JPEG、MP3、MPEG 等。

使用 zlib 库压缩文件

zlib 是一个广泛使用的 C 语言压缩库,它支持多种压缩算法,如 deflate、gzip、zlib 等。

以下是使用 zlib 压缩文件的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>

#define CHUNK_SIZE 1024

int compress_file(char *src_path, char *dest_path) {
    FILE *src_file = fopen(src_path, "rb");
    FILE *dest_file = fopen(dest_path, "wb");
    if (!src_file || !dest_file) {
        return -1;
    }

    // 初始化 zlib
    z_stream stream;
    memset(&stream, 0, sizeof(stream));
    deflateInit(&stream, Z_DEFAULT_COMPRESSION);

    unsigned char in[CHUNK_SIZE];
    unsigned char out[CHUNK_SIZE];
    int ret = 0;
    int flush = 0;

    do {
        stream.avail_in = fread(in, 1, CHUNK_SIZE, src_file);
        if (ferror(src_file)) {
            ret = Z_ERRNO;
            break;
        }
        flush = feof(src_file) ? Z_FINISH : Z_NO_FLUSH;
        stream.next_in = in;

        do {
            stream.avail_out = CHUNK_SIZE;
            stream.next_out = out;
            ret = deflate(&stream, flush);
            if (ret == Z_STREAM_ERROR) {
                break;
            }
            fwrite(out, 1, CHUNK_SIZE - stream.avail_out, dest_file);
        } while (stream.avail_out == 0);
        if (ret != Z_OK) {
            break;
        }
    } while (flush != Z_FINISH);
    if (ret == Z_STREAM_END) {
        ret = Z_OK;
    }

    // 清空 zlib
    deflateEnd(&stream);

    fclose(src_file);
    fclose(dest_file);
    return ret;
}

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("Usage: %s input output\n", argv[0]);
        return -1;
    }
    int ret = compress_file(argv[1], argv[2]);
    if (ret != Z_OK) {
        printf("Compress file failed: %d\n", ret);
        return -1;
    }
    printf("Compress file success\n");
    return 0;
}
总结

本文介绍了如何使用 C 语言对文件进行压缩。在实际项目开发中,我们可以根据具体要求选用合适的压缩算法和库,以达到更好的效果。