69,369
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include "string.h"
#define NULL 0
typedef struct _tg_struct
{
char f_name[30];
int savef_count;
}SAVEFILE;
enum
{
ERROR_PARAM,
ERROR_FILE,
SUCCESS,
};
int SaveFile(const char* fSrc1,const char* fSrc2,const char* fDes );//合并文件夹
int ReadFile(char* fDes,const char* fSrc1,const char* fSrc2const ); //分离文件夹
int main()
{
printf("正在写文件,请稍等.....");
SaveFile("c:\\a.txt","c:\\b.txt","c:\\c.txt");
printf("正在读文件,请稍等.....");
ReadFile("c:\\c.txt","c:\\d.txt","c:\\e.txt");
getchar();
return 0;
}
int SaveFile(const char* fSrc1,const char* fSrc2,const char* fDes )
{
SAVEFILE savef;
FILE* fpWrite,*fpRead;
char buffer[1024];
int a = 0;
int b = 0;
memset(&savef,0,sizeof(SAVEFILE));
fpWrite=fopen(fDes,"wb+");//写入目标文件
strcpy(savef.f_name,fSrc1);
fpRead=fopen(fSrc1,"rb");//读源文件1
if(fpWrite==NULL || fpRead==NULL)
{
return ERROR_PARAM;
}
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);//写文件头 此时savef.savef_count=0
while(!feof(fpRead))
{
a=0;
a=fread(buffer,1,1000,fpRead);//将内容读入到buffer中
printf("a=%d\n",a);
savef.savef_count+=a;//累计文件内容的字节数
fwrite(buffer,1,a,fpWrite);//读了再写入内容
}
fseek(fpWrite,0,SEEK_SET);//将指针置为文件开始处
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);//重写文件头 此时savef.savef_count!= 0
printf("savef_count=%d\n",savef.savef_count);
fseek(fpWrite,0,SEEK_END);//将文件指针指向文件最后
b=savef.savef_count;//这个留着下次写时有用
fclose(fpRead);
memset(&savef,0,sizeof(SAVEFILE));//如果对大文件进行置空的话,是非常耗费CPU的
strcpy(savef.f_name,fSrc2);//
printf("file2_name=%s\n",savef.f_name);
fpRead=fopen(fSrc2,"rb");//打开第二个文件
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);//写文件头信息
while(!feof(fpRead))
{
a=0;
a=fread(buffer,1,1000,fpRead);
printf("a=%d\n",a);
savef.savef_count+=a;
fwrite(buffer,1,a,fpWrite);//读了再写入内容
}
fseek(fpWrite,sizeof(SAVEFILE)+b,SEEK_SET);
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);
printf("savef_count=%d",savef.savef_count);
fclose(fpWrite);
fclose(fpRead);
}
int ReadFile(const char* fSrc,const char* fDes1,const char* fDes2 )
{
FILE *p_fwrite;//写
FILE *p_fread; //读
SAVEFILE savef;
char buffer[1024];
int a = 0;//字节数
int b = 0;//文件内容所占字节数
int current=0;//保存第一次分离的文件的内容所占的字节数
memset(&savef,0,sizeof(SAVEFILE));//置空结构体
p_fread=fopen(fSrc,"rb");//读写二进制
p_fwrite=fopen(fDes1,"wb+");//写附加
if(p_fwrite == NULL || p_fread == NULL)
{
printf("File open failed.....");
return ERROR_PARAM;
}
//将p_fread中指向的大小为sizeof(SAVEFILE)的内容读入到结构体savef中
a=fread(&savef,1,sizeof(SAVEFILE),p_fread);
//savef包括两个部分,一个30字节的文件头 一个4字节的文件内容字节数
b=savef.savef_count;
current=b;//记下
printf("\nThe first file bytes is %d\n",b);
if(b > 0)
{
//如果大于0 存在内容 循环控制读取
while(b >= 1000)
{
a=0;
a=fread(buffer,1,1000,p_fread);//读入buffer保存读取数据
b-=a;//如果b<1000 则跳出循环 然后按照一次b个字节读取
fwrite(buffer,1,a,p_fwrite);//第一次分离文件,写指针指向fDes1
if(b < 1000)
break;
}
if(b < 1000 && b > 0)
{
a=fread(buffer,1,b,p_fread);//一次读完
fwrite(buffer,1,a,p_fwrite);//一次写完
}
}//end first
fclose(p_fwrite);//关闭第一次读的文件指针
printf("分离并写入%s成功\n\n",savef.f_name);
//第二次读
memset(&savef,0,sizeof(SAVEFILE));//再一次置空,防止数据干扰
p_fwrite=fopen(fDes2,"wb+");//分离第二个文件
fseek(p_fread,sizeof(SAVEFILE)+current,SEEK_SET);//当前读指针指向第二个文件头处
a=fread(&savef,1,sizeof(SAVEFILE),p_fread);
printf("\nsave_count=%d\n",savef.savef_count);
b=savef.savef_count;//第二个文件内容所占的字节数
//同上面,流程一样 最好封装一下
printf("\nThe first file bytes is %d\n",b);
if(b > 0)
{
while(b <= 1000)
{
a=0;
a=fread(buffer,1,1000,p_fread);
b-=a;
fwrite(buffer,1,a,p_fwrite);
//判断下b的值
if(b < 1000)
break;//直接跳出
}
if(b > 0 && b < 1000)
{
a=fread(buffer,1,b,p_fread);
//再一次写入剩下不足1000字节的内容
fwrite(buffer,1,a,p_fwrite);
}
}//end second
printf("分离并写入%s成功",savef.f_name);
fclose(p_fwrite);//关闭
fclose(p_fread);
}