linux c语言实现断点续传

发布时间:2023年12月26日
#include <stdio.h>
#include <stdlib.h>

#define PACKAGE_SIZE (8)  // 定义包的大小为8字节
#define INPUT_FILENAME "example.txt" // 输入文件名
#define OUTPUT_FILENAME "output.txt" // 输出文件名

int main() {
    FILE *input_fp, *output_fp;
    int start_package = 2;  // 起始包的位置(从0开始计数)
    int num_packages, last_package_size;

    // 打开输入文件
    input_fp = fopen(INPUT_FILENAME, "rb");
    if (input_fp == NULL) {
        printf("无法打开输入文件\n");
        return 1;
    }

    // 获取输入文件大小
    fseek(input_fp, 0, SEEK_END);
    long file_size = ftell(input_fp);
    fseek(input_fp, 0, SEEK_SET);
    
    // 计算包数目和最后一个包的大小
    num_packages = file_size / PACKAGE_SIZE;
    last_package_size = file_size % PACKAGE_SIZE;

    // 打开输出文件以追加写入模式(如果存在),或新建文件
    output_fp = fopen(OUTPUT_FILENAME, "ab");
    if (output_fp == NULL) {
        output_fp = fopen(OUTPUT_FILENAME, "wb");
        if (output_fp == NULL) {
            printf("无法创建输出文件\n");
            fclose(input_fp);
            return 1;
        }
    }

    // 跳过指定位置之前的包
    fseek(input_fp, start_package * PACKAGE_SIZE, SEEK_SET);

    // 读取指定位置的包并写入输出文件
    for (int i = start_package; i < num_packages; i++) {
        char *buffer = (char *)malloc(PACKAGE_SIZE);
        fread(buffer, 1, PACKAGE_SIZE, input_fp);

        // 写入输出文件
        fwrite(buffer, 1, PACKAGE_SIZE, output_fp);

        free(buffer);
    }

    // 如果有最后一个包,继续读取并写入输出文件
    if (last_package_size > 0) {
        char *buffer = (char *)malloc(last_package_size);
        fread(buffer, 1, last_package_size, input_fp);

        // 写入输出文件
        fwrite(buffer, 1, last_package_size, output_fp);

        free(buffer);
    }

    // 关闭文件
    fclose(input_fp);
    fclose(output_fp);

    return 0;
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_38849487/article/details/135215571
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。