很不错
我也写了个,传上来大家看下:
/***********
文件分割
***********/
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define MAX 1024
int in_name(char *p,int len); //安全输入文件名
void getname_suf(char* input,char* outname,char* suffix); //取出文件名和扩展名
void divide(char *inputfile,int count); //文件分割子程序
int main(void)
{
char inputfile[80];
int count;
puts("请输入要分割的文件:");
in_name(inputfile,78); //分割后文件名比原文件名长
puts("请输入分割后的文件个数:");
scanf("%d",&count);
while(count<2)
{
puts("分割个数不能小于2,请重新输入:");
scanf("%d",&count);
}
divide(inputfile,count);
printf("\n\n 文件被成功分割成%d个,按ENTER键退出!\n",count);
getch();
getch();
return 0;
}
int in_name(char *p,int len)
{ int i=1;
char ch;
while(((ch=getchar())!='\n')&&(i<len))
{
i++;
if(ch=='\"') continue;
else *p++=ch;
}
*p='\0';
return --i;
}
void getname_suf(char* input,char* outname,char* suffix)
{
char *p,flag=0;
int len;
len=strlen(input)-1;
p=input+len;
while(*p!='\\' && len-->=0)
{
if(*p--=='.')
{
flag=1;
break;
}
}
if(flag)
{ ++p;
while(input!=p)
*outname++=*input++;
*outname='\0';
while((*suffix++=*p++)!='\0');
}
else
{
strcpy(outname,input);
*suffix='\0';
}
}
void divide(char *inputfile,int count)
{
FILE *fin,*fout;
int read_count, //每个数据块读取次数
i,j,
left, //每个数据块读取整数次缓冲区大小余下的
last; //读最后一个数据块余下的
char outname[80], //生成文件的文件名
name[80], //生成文件的文件名(不含扩展名)
buf[MAX], //缓冲区大小
flag=0, //生成文件大小是否是缓冲区大小整数倍
lastflag=0, //最后一个文件小是否是缓冲区大小整数倍
suffix[10], //扩展名
ch[5];
long size, //要分割的文件大小
each_size; //生成文件大小
if((fin=fopen(inputfile,"rb"))==NULL)
{
puts("要分割的文件打不开!");
getch();
exit(1);
}
fseek(fin,0L,SEEK_END);
size=ftell(fin); //求文件大小
rewind(fin);
each_size=size/count;
if(size%count!=0)
{
lastflag=1;
last=size%count;
}
read_count=each_size/MAX;
if(each_size%MAX!=0)
{
flag=1;
left=each_size%MAX;
}
getname_suf(inputfile,name,suffix);
for(i=0;i<count;i++)
{
strcpy(outname,name);
sprintf(ch,"%d",i+1);
strcat(outname,ch);
strcat(outname,suffix);
if((fout=fopen(outname,"wb"))==NULL)
{
puts("输出文件打不开!");
getch();
exit(1);
}
for(j=0;j<read_count;j++)
{
fread(buf,MAX,1,fin);
fwrite(buf,MAX,1,fout);
}
if(flag)
{ fread(buf,left,1,fin);
fwrite(buf,left,1,fout);
}
if(i==count-1&&lastflag)
{
fread(buf,last,1,fin);
fwrite(buf,last,1,fout);
}
fclose(fout);
}
fclose(fin);
}