c语言文件分割与合并程序详解,c语言的文件合并文件和分割文件

问题描述:

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

1.文件的分割示例

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

分割文件示例:

9b975ae8b0aa4899852392f3b8ccc526.jpg

分割后文件示例

2187f74879b3479ba0e9e202dafc8494.jpg

2.合并文件示例

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

ea02eaac53bc48cabef91e4c1b77a513.jpg

合并后的b1.txt ,如图:

88ac9a431fbf44f99f3d537a92d95210.jpg

模块概述:

1.菜单选择模块

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

88df063246e8442db3247c8b089950b4.jpg

实现功能:

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.文件分割模块:

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

9c7242a16c96492fbbccde486370bd46.jpg

(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.合并文件模块

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

84c4af07a59b5ab71e7499c5bc5ce63b.png

(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#include#include/*

*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

3.心得体会:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML+CSS+JS实现月球上行走的宇航员网页设计

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &…

基于Springboot+mybatis+lyaui实现学科竞赛管理系统【详细设计--附完整源码】

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; …

Web前端期末大作业--响应式性感美女模特博客网页设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

web前端大作业--响应式风景旅游网页设计(国庆旅游主题-HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

c语言抓取抖音视频,【FiddlerScript】利用Fiddler中的FiddlerScript自动抓取抖音无水印视频并且自动保存...

本帖最后由 小白大侠 于 2021-3-14 13:55 编辑Fiddler自动抓取抖音无水印视频并且自动保存前言:这段代码实用性不大&#xff0c;大量数据处理容易造成Fiddler卡死&#xff0c;只是希望给未来写FiddlerScript脚本的人一点启发&#xff0c;毕竟有些代码的写法百度不到准备工具:Xp…

Web前端期末大作业--响应式风景旅游网页设计(国庆旅游主题-HTML+CSS+JavaScript)实现(二)

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

c++语言 tcp例子,C++中TCP通信实现文件传输

作为Computer networks课程的一个project&#xff0c;我们需要实现用TCP在mininet中client和server的相互通信&#xff0c;需要能够传输文本文件&#xff0c;binary file 和image file。整个project的目的还是比较明确的。我主要列出了一下几个问题&#xff0c;需要在代码中实现…

H5+echarts模拟全国程序员可视化大数据【附完整源码】

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末免费获取源码&#x1f345; 临近学期结束&#xff…

Java期末大作业基础项目--在线学生选课系统

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f345; 临近学期结束&#xff…

Web前端期末大作业--响应式网络科技公司网页设计(IT网络主题-HTML+CSS+JavaScript)实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &…

Web前端期末大作业--响应式电竞博客网页设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

web前端期末大作业--响应式汽车租赁网页设计--(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;网页要求的总数量太多&#xff1f;HTML网页作业无从下手&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

Web前端期末大作业--响应式个人日志博客网页设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;网页要求的总数量太多&#xff1f;HTML网页作业无从下手&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

HTML+CSS+JS实现canvas仿ps橡皮擦刮卡效果

效果演示&#xff1a; 文末获取源码 主要JS代码实现 <div class"box" id"bb"><canvas id"cas" width"1366" height"651"></canvas></div><script type"text/javascript" charset&quo…

android寻找手机,寻找那些“干净”的Android手机

非原生Android系统、预装的各种第三方APP&#xff0c;都是拖慢手机运行效率和速度的“罪魁祸首”。那么&#xff0c;现在还有没有“干净”Android手机值得我们选择呢&#xff1f;为了体现“差异化”&#xff0c;绝大多数手机厂商都有自己的“OS”&#xff0c;比如MIUI、Sense等…

android 控件 margin,Android MarginDesign控件TabLayout导航栏使用详解

TabLayout的使用简单介绍比如在平常的项目中实现这样的效果&#xff0c;一般都是都会使用viewPageIndicate等几个开源框架直接实现&#xff0c;或者使用自定义的HorizontalScroll再配合ViewPageFragment实现。在谷歌推出marginDesign之后&#xff0c;实现这种效果可以直接使用T…

Web前端期末大作业--响应式有氧健身休闲会所网页设计(HTML+CSS+JavaScript)

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;网页要求的总数量太多&#xff1f;HTML网页作业无从下手&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式

一、介绍&#xff0c;定义抽象工厂模式也是创建型模式之一&#xff0c;抽象工厂模式起源于对不同操作系统的图形化解决方案&#xff0c;如不同操作系统的按钮和文本框控件及其实现。为创建一组相关或者相互依赖的对象提供接口&#xff0c;而不需要具体指定他们的具体类。二、使…

Web前端期末大作业--响应式健身会所网页设计(HTML+CSS+JS)实现

临近期末, 你还在为HTML网页设计结课作业,HTML网页作业无从下手&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; java项目精品实战分享案例《100套…