大文本的分割

净折腾文本文件了

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

/*全局结构体数组*/
struct NameListStruct
{
    char Name[100];
}List[100];

/*函数申明*/
void Show(void);//显示一些特定信息
int ReadFileList(void);//读取exe文件所在目录的文件列表,并筛选出txt文档,放入全局的结构体数组中
void PrintFileList(int row);//txt文档列表
int ReScanf(int min, int max);//输入选择,错误后循环提示,直至输入正确

                              /**************************************************************************************************
                              函数用途:main函数,程序入口;读取txt列表,并分割选中的文件
                              输入参数:无
                              返回参数:无
                              */
void main(void)
{
    FILE *fpSrc, *fpDec;
    unsigned char* buff;
    int i, j, select, FileNum = 0, singleFileSize;
    long size;
    char fileName_Suffix[100], fileName[100], fileNameTmp[100];

    Show();//显示一些无关紧要的信息
    FileNum = ReadFileList();//读取txt文件列表
    PrintFileList(FileNum);//打印txt文件列表

    printf("\n待分割的文件序号: ");  //菜单显示
    select = ReScanf(1, FileNum);//输入序号

                                 /* 下面五行内容,用于分别去除字符串中最后一个回车和后缀名 */
    strcpy(fileName_Suffix, List[select].Name);
    j = strlen(fileName_Suffix) - 1;
    fileName_Suffix[j] = '\0';//字符用单引号,去掉最后一个回车
    strcpy(fileName, fileName_Suffix);
    fileName[j - 4] = '\0';//将文件名去除后缀

    printf("\n分割的文档是:“%s”,", fileName_Suffix);
    if ((fpSrc = fopen(fileName_Suffix, "r")) == 0)//判断是否有文件
    {
        printf("\n\n找不到文件,程序退出!\n");
        system("pause");//任意键继续
        exit(1);
    }

    fseek(fpSrc, 0L, SEEK_END);//将指针移动到末位
    size = ftell(fpSrc);//计算文件长度,目前指针的位置既是文件的长度
    if (size < 10000)
    {
        printf("这个文件长度为:“%ld”字节。\n你的文件太小了。程序退出!\n", size);
        system("pause");//任意键继续
        exit(0);
    }
    printf("这个文件长度为:%ld字节。\n分割成几段:", size);
    select = ReScanf(2, 10000);//输入分割成几段的数值

    singleFileSize = size / select;//计算每个小文件大小
    printf("\n下面将会把“%s”分割成%d个大小为:%d字节(%dKB)的文件。\n\n", fileName_Suffix, select, singleFileSize, singleFileSize / 1024);
    system("pause");//任意键继续

    fseek(fpSrc, 0L, SEEK_SET);//将指针移动到首位
    for (i = 1; i <= select; i++)
    {
        buff = (unsigned char*)malloc(singleFileSize);//动态申请单个小文件大小所需的内存
        sprintf(fileNameTmp, "%s _%02d.txt", fileName, i);//文件名拼接
        fread(buff, singleFileSize, 1, fpSrc);//从fpSrc中读取数据到buff
        fpDec = fopen(fileNameTmp, "w");//新建小文件
        fwrite(buff, singleFileSize, 1, fpDec);//将buff数据写入到fpDec
        free(buff);//释放内存
        fclose(fpDec);//关闭目标文件
        printf("\n“%s”已成功生成!", fileNameTmp);
    }
    fclose(fpSrc);//关闭源文件

    printf("\n分割完毕!程序退出!");
    system("pause");//任意键继续
    exit(0);
}

/**************************************************************************************************
函数用途:显示一些特定信息
输入参数:无
返回参数:无
*/
void Show(void)
{
        system("文本文档分割");//使dos界面的上框显示这条信息
        printf("——————————文档分割大法好——————————\n");

}

/**************************************************************************************************
函数用途:读取exe文件所在目录的文件列表,并筛选出txt文档,放入全局的结构体数组中
输入参数:无
返回参数:txt文件的数量值
*/
int ReadFileList(void)
{
    FILE *fp;
    int i = 0, row = 0;
    char fileList[100][100];

    system("DIR /B > TmpDirList.log");//将文件列表读入到log文件中

    fp = fopen("TmpDirList.log", "r");//读到fp0
    for (; i < 100; i++)
    {
        if (fgets(fileList[i], 100, fp) == NULL) //读取一行到fileList[i]
            break;
        if (strstr(fileList[i], ".txt") != NULL)//判断是否是txt文件
        {
            if (row == 0)//第一行显示的内容
                printf("当前目录下有以下文本文档:\n");
            row++;
            strcpy(List[row].Name, fileList[i]);//将txt文件列表复制到List结构体中去
        }
    }
    fclose(fp);
    remove("TmpDirList.log");//删除这个存储文件列表的临时文件

    return row;
}

/**************************************************************************************************
函数用途:打印txt文档列表
输入参数:txt文件的数量值
返回参数:无
*/
void PrintFileList(int row)
{
    int i = 1;

    if (row <= 0)
    {
        printf("无文本文档。程序退出!\n");
        system("pause");//任意键继续
        exit(0);//结束程序
    }
    else
        for (; i <= row; i++)//打印txt文件列表
            if (List[i].Name != "")
                printf("%2d. %s", i, List[i].Name);
}

/**************************************************************************************************
函数用途:输入选择,错误后循环提示,直至输入正确
输入参数:min:允许的最小输入值,max:允许的最大输入值
返回参数:输入的值
*/
int ReScanf(int min, int max)
{
    int select;

    fflush(stdin);
    scanf("%d", &select);    //输入选择
    while (select > max || select < min)
    {
        printf("\n输入有误,请输入%d-%d之间的数字: ", min, max);
        fflush(stdin);
        scanf("%d", &select);    //输入选择
    }

    return select;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值