c语言分割大文件(实例)

先看一下原文件的大小,如图

image.png

下面贴出我写的一段处理代码:

/**********
* C语言分割大文件
**********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义每次获取的文件大小
#define READSIZE 1024

int main(){
    printf("------大文件分割------\n\n");
    //定义写入文件的路径变量
    char filePath[255];
    //定义读写文件指针
    FILE *in, *out=nullptr;
    printf("请输入要分割的文件完整路径:");
    scanf("%s", &filePath);
    in = fopen(filePath, "r");
    if(in == nullptr){
        printf("打开源文件失败\n");
        exit(0);
    }
    printf("请输入要分割的文件大小:(单位:G/M/K)");
    char splitSize[50]; //用户输入的字符
    char newFileSize[50] = "";  //存放处理后的数字字符
    unsigned int newFileSizeNum;  //转换字符为数字
    char unit;
    scanf("%s", &splitSize);
    //判断有效性及单位
    bool err = false;
    for(unsigned int i=0; i<strlen(splitSize); i++){
        //前几位必须是数字
        if(i < (strlen(splitSize)-1)){
            //判断是否为数字
            if(splitSize[i] >= '0' && splitSize[i] <= '9'){
                newFileSize[i] = splitSize[i];
            }else{
                err = true;
                break;
            }
        }else{
            //判断单位是否有效
            if(splitSize[i]=='G' || splitSize[i]=='M' || splitSize[i]=='K'){
                unit = splitSize[i];
                break;
            }else{
                err = true;
                break;
            }
        }
    }
    if(err == true){
        printf("输入的格式错误");
        exit(0);
    }
    newFileSizeNum = atoi(newFileSize);
    //按单位处理为字节大小
    switch (unit) {
    case 'G':{
        newFileSizeNum *= 1024 * 1024 * 1024;
        break;
    }
    case 'M':{
        newFileSizeNum *= 1024 * 1024;
        break;
    }
    case 'K':{
        newFileSizeNum *= 1024;
        break;
    }
    }
    //对文件进入分割
    char tmp[READSIZE];
    int countNum = 0;
    int partNum = 1;
    char newFilePath[255];
    while (!feof(in)) {
        //如果当前写入的文件大小已经达到用户设置的文件大小,则进入初始化
        if(countNum >= newFileSizeNum){
            countNum = 0;
            partNum ++;
            fclose(out);
            out = nullptr;
        }
        fgets(tmp, READSIZE, in);

        //如果out为空指针,则进入打开文件
        if(out == nullptr){
            //建议新的文件
            strcpy(newFilePath, filePath);
            strcat(newFilePath, "_");
            sprintf(newFilePath, "%s%d", newFilePath, partNum);
            //打开新文件
            out = fopen(newFilePath, "a+");
        }
        //写文件
        fputs(tmp, out);
        //统计实际写入的文件大小
        countNum += strlen(tmp);
    }
    //关闭读、写的文件
    fclose(in);
    fclose(out);

    printf("文件分割完成,本次共分割了%d个新文件", partNum);

    return 0;
}


运行代码,输入参数

image.png


看一下最后分割成功后的文件列表,最后一个文件存放的是剩余的数据

image.png

版权声明: 此文为本站源创文章[或由本站编辑从网络整理改编],
转载请备注出处:
[狂码一生] https://www.sindsun.com/articles/16/133
[若此文确切存在侵权,请联系本站管理员进行删除!]


--THE END--