c语言的文件合并文件和分割文件

问题描述:

可以把文件分割成为若干部分存储,并且每个文件的大小都是平均的,也可以对把若干个文件整合到一个文件中,实现对文件的合并。该程序主要分为菜单选择模块、文件分割模块、文件合并模块、计算文件大小模块。

1.文件的分割示例

老学长找到一段小诗存放在a.txt文件中,将其分割大小相等的两段,分别存放在a1.txt和a2.txt文件中:

分割文件示例:

分割后文件示例 

2.合并文件示例 

老学长通过刚才的a1.txt和a2.txt俩文件合并到b.txt中:

合并后的b1.txt ,如图:

 

模块概述:

1.菜单选择模块

菜单选择模块功能便是对显示文件的合并和分割以及退出这三个选项,当用户选择相应的选项后进入相应的操作,对磁盘文件的分割选项,此时会运行文件分割的程序,对任何类型的文件进行等份分割处理。选中文件合并的选项是对磁盘文件进行整合处理,此实文件可以对想要整合的文件进行合并整理。最后退出的选项则是结束整个程序。菜单显示的界面如下:

实现功能:

1.通过do-while循环,当输入选项不是菜单中的选项时将重复输出菜单栏

2.用if-else对菜单项进行选择判断;

do
     {
         printf("+++++++++++++++++++++++++++++++++++\n");
         printf("+      请选择需要处理的文件选项: +\n");
         printf("+++++++++++++++++++++++++++++++++++\n");
         printf("+                                 +\n");
         printf("+ 1.分离文件  2.合并文件  3.退出  +\n");
         printf("+                                 +\n");
         printf("+++++++++++++++++++++++++++++++++++\n");
         printf("请输入以上选项:");
         scanf("%d",&n);
         if(n==1)
		 divide123();/*分割文件*/
         else
         if(n==2)
         unite123();/*合并文件*/
         else
         if(n==3)
         exit(0);/*退出*/
     }while(n<1||n>3);

3.文件分割模块:

文件分割模块中首先会提示需要用户待输入的文件路径;以及待分割的磁盘文件的几份,最后根据用户的输入要求把分割文件内容存放再的新文件路径中。如图所示:

(1)将文件分割为若干份存在磁盘上,其中需要用户自己输入文件的路径和文件名称,用二进制只读的方式判断文件是否打开成功。关建代码如下:

if((fp2=fopen(name,"rb"))==NULL)
    {
     printf("\n文件路径错误,是否重新输入(Y/N):");
     getchar();
     c=getchar();
     if(c=='Y'||c=='y')
        goto lp1;
     else
        menu123();
     }

(2)确定分割份数,根据提示的输入份数调用sizefile()计算文件大小的函数,计算出文件总的大小,再除以需要分割的文件分数可以算出每份文件的大小。关建代码如下所示:

  printf("\n需要将文件分割为几份:");
  lp2:
  scanf("%d",&n);
  if(n<1)
  { printf("\n抱歉,请输入正确的分割份数:"); goto lp2;}
  else
 sizef=sizefile(fp2);//自定义计算文件大小函数
   ev_sizef=sizef/n;    

其中sizefile()函数主要时计算文件的大小,将文件平均分为若干份,再平均分配存盘。在计算文件的大小时主要应用了测试文件流的技术,使用feof()函数测试文件流指针是否到文件结尾,通过fgetc()函数一个一个的读取文件字符,并使用sizef整型变量对文件变量进行累加,当到达文件指针结尾时跳出循环,使用rewinfd()函数重新让文件指针指向文件开头,具体代码如下:

int sizefile(fp)/*计算文件大小*/
FILE *fp;                             /*定义文件类型指针*/
{
    sizef=0;
    while(!feof(fp))
    { fgetc(fp);
        sizef++;    }
    rewind(fp);
    return sizef-1;
}

 (3).调用分割文件中的dividefile()函数,对文件进行分割存盘,分别存放再自己根据提示设置的路径文件下,关建代码如下代码如下:

 dividefile(n);/*分割存盘*/

 dividefile()函数主要运用到了向磁盘文件写入函数和读取函数

4.合并文件模块

合并文件的过程中主要是将多个文件合并到将到一个文件中(文件的类型可以不同),根据提示输入输入待合并文件的路径,运行效果图如下:

(1).合并文件时需要自己输入待合并文件的路径,由于要向文件中写入数据,因此要判断是否能用二进制只写的形式将文件打开成功。关键代码如下:

  printf(" \n\n请输入需要合并存放的文件中的路径为:");
  scanf("%s",name);
  if((fp1=fopen(name,"wb"))==NULL)
    {
     printf("\n路径错误,是否重新输入(Y/N):");
     getchar();
     c=getchar();
     if(c=='Y'||c=='y')
     goto lp1;
     else
     menu123();
     }

 (2).调用unitefile123()函数确定将什么文件进行合并,再将需要合并的文件也二进制读写的方式打开,执行文件的读写操作,主要代码如下:

  do
    {
     lp1:
     printf("\n请输入想要合并的第%d个文件的路径:",i++);
     scanf("%s",name);
      if((fp2=fopen(name,"rb+"))==NULL)
      {
        printf("\n输入的新文件位置有误,是否重新输入新文件的位置(Y/N):");
        if(getchar()=='Y'||getchar()=='y')
          goto lp1;
        else
           menu123();
       }
        while(fread(buffer,1,1,fp2))
            fwrite(buffer,1,1,fp1);
      fclose(fp2);//光标文件
      printf("\n是否继续进行合并(Y/按下任意键): ");
      getchar();
      c=getchar();
    }while(c=='y'||c=='Y');

 

2.程序完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
*csdn学院
*目的:让代码见证成长(作为一个初学的菜鸟,如
*大家有发现错误,欢迎指正!)
*运行软件:CodeBlocks
*作者:小臣小仁
*完成日期:2020年7月12日
*/
#define SIZE 1024
char buffer[SIZE];
 FILE *fp1,*fp2;
double sizef,ev_sizef;

void menu123(); /*主界面的选择菜单*/
void divide123();/*分割文件*/
void unite123();/*合并文件*/
void unitefile123();/*合并文件*/
void dividefile(int );/*分割文件*/
int sizefile(fp)/*计算文件大小*/
FILE *fp;                             /*定义文件类型指针*/
{
    sizef=0;
    while(!feof(fp))
    { fgetc(fp);
        sizef++;    }
    rewind(fp);
    return sizef-1;
}

int main()
{
    menu123();
}
void menu123()            /*主界面的选择菜单*/
{
    int n;
  /* clrscr();/*清除整个当前字符窗口,并且把光标定位于左上角(1,1)处*/
    do
     {
         printf("   +++++++++++++++++++++++++++++++++++\n");
         printf("   +      请选择需要处理的文件选项: +\n");
         printf("   +++++++++++++++++++++++++++++++++++\n");
         printf("   +                                 +\n");
         printf("   + 1.分离文件  2.合并文件  3.退出  +\n");
         printf("   +                                 +\n");
         printf("   +++++++++++++++++++++++++++++++++++\n");
         printf("   请输入以上选项:");
         scanf("%d",&n);
         if(n==1)
		 divide123();/*分割文件*/
         else
         if(n==2)
         unite123();/*合并文件*/
         else
         if(n==3)
         exit(0);/*退出*/
     }while(n<1||n>3);
}
void unite123()              /*合并文件*/
{
  int n;
  char name[25],c;
  lp:
  lp1:
  printf(" \n\n请输入需要合并存放的文件中的路径为:");
  scanf("%s",name);
  if((fp1=fopen(name,"wb"))==NULL)
    {
     printf("\n路径错误,是否重新输入(Y/N):");
     getchar();
     c=getchar();
     if(c=='Y'||c=='y')
     goto lp1;
     else
     menu123();
     }
  unitefile123();
  printf("\n合并文件成功,是否继续合并其他文件(Y/N):");
  getchar();
  c=getchar();
  if(c=='Y'||c=='y')
  goto lp;
  else
  menu123();
}
void unitefile123()      /*合并文件*/
{
  int i=1;
  char name[25],c;
  do
    {
     lp1:
     printf("\n请输入想要合并的第%d个文件的路径:",i++);
     scanf("%s",name);
      if((fp2=fopen(name,"rb+"))==NULL)
      {
        printf("\n输入的文件路径有误,是否重新输入文件的位置(Y/N):");
        if(getchar()=='Y'||getchar()=='y')
          goto lp1;
        else
           menu123();
       }
        while(fread(buffer,1,1,fp2))
            fwrite(buffer,1,1,fp1);
      fclose(fp2);//光标文件
      printf("\n是否继续进行合并(Y/按下任意键): ");
      getchar();
      c=getchar();
    }while(c=='y'||c=='Y');
  fclose(fp1);
}
void divide123()     /*分割文件*/
{
  int n;
  char name[25],c;
  lp:
  lp1:
  printf("\n请输入待分离的文件的路径:");
  scanf("%s",name);
  if((fp2=fopen(name,"rb"))==NULL)
    {
     printf("\n文件路径错误,是否重新输入(Y/N):");
     getchar();
     c=getchar();
     if(c=='Y'||c=='y')
        goto lp1;
     else
        menu123();
     }
  printf("\n需要将文件分割为几份:");
  lp2:
  scanf("%d",&n);
  if(n<1)
  { printf("\n抱歉,请输入正确的分割份数:"); goto lp2;}
  else
 sizef=sizefile(fp2);
   ev_sizef=sizef/n;                      /*被分割后每一个子文件的大小*/
  printf("\n该文件长度为:%.0f字节,分割到每分文件大小为:%.0f 字节\n",sizef,ev_sizef);
  dividefile(n);/*分割存盘*/
  printf("\n分割成功,是否继续进行分割(Y/N)\n");
  getchar();
  c=getchar();
  printf("\n\n");
  if(c=='Y'||c=='y')
  goto lp;
  else
   menu123();
}
void dividefile(int n)      /*分割文件*/
{
  int i,d=1;
  char name[25],*c;
  c=(char*)malloc(sizeof(char));
  for(i=0;i<n;i++)
   {
     lp1:
     printf("\n请输入需要分割第%d份新文件的位置:",i+1);
     scanf("%s",name);
      if((fp1=fopen(name,"wb"))==NULL)
      {
        printf("\n你输入的文件路径错误, 是否重新输入文件路径(Y/N):");
            if(getchar()=='Y'||getchar()=='y')
          goto lp1;
          else
          {
            fclose(fp2);
            menu123();
          }
       }
       d=1;
     if(i!=n)
        while(d<=ev_sizef)
       { fputc(fgetc(fp2),fp1); d++;}
      else
        while(fread(c,1,1,fp2))//c指向内存的指针,
        {
          fwrite(c,1,1,fp1);
        }
     fclose(fp1);
    }
    free(c);
    fclose(fp2);
}

3.心得体会:

在编写程序的时候,学弟学妹们可以用来练练手,老学长在敲代码时候可能多多少少有错哦,当然如果你发现有什么错误的地方或者编写的不合理的地方,还得多多指正,一起进步嘛。希望有同学和我这个老学长一起开心的敲代码,哈哈哈哈哈!

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值