/*文本文件处理工具/*文本文件处理工具
/*文
本文件处理工具,该程序在turboc2.0环境下编译通过*/
#include
#include
#include
#include
#include
#include
void character() /*字数和单词统计函数*/
{
FILE *fr;
unsigned chinese=0,word=0,other=0; /*分别统计汉字,单词和其它字符*/
char in_name[50],ch[2]; /*ch用来检测汉字和单词*/
a1:printf("请输入文件...
/*文本文件处理工具
/*文
本文件处理工具,该程序在turboc2.0环境下编译通过*/
#include
#include
#include
#include
#include
#include
void character() /*字数和单词统计函数*/
{
FILE *fr;
unsigned chinese=0,word=0,other=0; /*分别统计汉字,单词和其它字符*/
char in_name[50],ch[2]; /*ch用来检测汉字和单词*/
a1:printf("请输入文件名(包含路径,直接回车则退出此项操作):\n");
gets(in_name);
if(in_name[0]=='\0')
return;
if((fr=fopen(in_name,"r"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a1;
}
while((ch[0]=fgetc(fr))!=EOF)
{
ch[1]=fgetc(fr);
fseek(fr,-1,1);
if(ch[0]<0&&ch[1]<0)
{
chinese++;
fseek(fr,1,1);
}
else
if(((ch[0]>='A'&&ch[0]<='Z')||(ch[0]>='a'&&ch[0]<='z'))&&((ch[1]<'A'||(ch[1]>'Z'&&c
h[1]<'a')||ch[1]>'z')&&ch[1]!=45))
word++;
else
if(ch[0]>0&&(!(ch[0]>='A'&&ch[0]<='Z')&&!(ch[0]>='a'&&ch[0]<='z')))
other++;
if(ch[1]==EOF)
break;
}
printf("该文件共有%u个汉字,%u个单词,%u个其它字符.\n",chinese,word,other);
fclose(fr);
getch();
}
void replace() /*查找替换函数*/
{
FILE *fr,*fw;
char in_name[50],out_name[50],path[50]; /*path存放路径*/
char ch;/*存放路径*/
char p1[20],p2[20]; /*p1存放要查找的内容,p2存放要替换的内容*/
unsigned line=1; /*line用来检测要查找的内容在多少行*/
int flag=0;
long i=0,k; /*k用来标记所读取文件路径的结束点*/
a1:printf("请输入文件名(包含路径,直接回车则退出此项操作):\n");
gets(in_name);
if(in_name[0]=='\0')
return;
if((fr=fopen(in_name,"r"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a1;
}
printf("请输入你想查找的字符(20个以内):\n");
gets(p1);
printf("替换成(直接回车则只查找不替换):\n");
gets(p2);
if(p2[0]=='\0')
flag=1; /*只查找不替换*/
if(flag==1) /*查找*/
{
flag=0;
ch=fgetc(fr);
while(!feof(fr))
{
if(ch==10)
line++;
if(ch==p1[i])
i++;
else if(ch!=p1[i])
i=0;
if(i==strlen(p1))
{
printf("找到你所要查找的内容,位于第%u行。
\n",line);
i=0;
flag++;
}
ch=fgetc(fr);
}
if(flag==0)
printf("没有找到相匹配的字符或字符串。\n");
fclose(fr);
}
else if(flag==0) /*替换*/
{
a2:printf("另存为(直接回车则覆盖源文件):\n");
gets(out_name);
if(strcmp(in_name,out_name)==0)
{
printf("您输入的新文件与源文件相同,请重新输入。\n");
goto a2;
}
if(out_name[0]=='\0') /*覆盖源文件*/
{
for(i=0;in_name[i]!='\0';i++)
if(in_name[i]==92)
k=i;
for(i=0;i<=k;i++)
path[i]=in_name[i];
path[i]='\0';
strcat(path,"tmp.tmp");
fw=fopen(path,"w");
i=0;
ch=fgetc(fr);
while(!feof(fr))
{
if(ch==p1[i])
i++;
else if(ch!=p1[i])
{
fseek(fr,-i,1);
if(i!=0)ch=fgetc(fr);
i=0;
fputc(ch,fw);
}
if(i==strlen(p1))
{
fputs(p2,fw);
i=0;
}
ch=fgetc(fr);
}
fclose(fr);
fclose(fw);
unlink(in_name);
rename(path,in_name);
}
else /*另存为新文件*/
{
flag=access(out_name,0);
if(flag==0)
{
printf("目标文件已经存在,是否替换?\n");
printf("Y->替换 其它键->另输入文件名 :");
ch=getchar();
fflush(stdin);
if(ch!='Y'&&ch!='y') /*不替换*/
goto a2;
}
if((fw=fopen(out_name,"w"))==NULL)
{
printf("无法创建新文件,请确认磁盘空间未满且磁
盘没有写保护。\n");
goto a2;
}
ch=fgetc(fr); /*执行替换操作*/
while(!feof(fr))
{
if(ch==p1[i])
i++;
else if(ch!=p1[i])
{
fseek(fr,-i,1);
if(i!=0)ch=fgetc(fr);
i=0;
fputc(ch,fw);
}
if(i==strlen(p1))
{
fputs(p2,fw);
i=0;
}
ch=fgetc(fr);
}
fclose(fw);
fclose(fr);
}
}
printf("操作结束,按任意键继续...");
getch();
}
void compare() /*文件比较函数*/
{
char name1[50],name2[50];
char c1,c2;
FILE *fp1,*fp2;
printf("请输入要比较的两个文件(包含路径,直接输入回车则退出此项操作):\n");
a1:printf("文件一:");
gets(name1);
if(name1[0]=='\0')
return;
if((fp1=fopen(name1,"rb"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a1;
}
a2:printf("文件二:");
gets(name2);
if(name2[0]=='\0')
return;
if((fp2=fopen(name2,"rb"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a2;
}
c1=fgetc(fp1);
c2=fgetc(fp2);
while(!feof(fp1)&&!feof(fp2))
{
if(c1!=c2)
{
printf("这两个文件内容不同。\n");
fclose(fp1);
fclose(fp2);
getch();
return;
}
c1=fgetc(fp1);
c2=fgetc(fp2);
}
if(!feof(fp1)||!feof(fp2))
printf("这两个文件内容不同。\n");
else
printf("这两个文件完全相同。\n");
fclose(fp1);
fclose(fp2);
getch();
}
void split() /*文件分割合并函数*/
{
FILE *fr,*fw; /*fr指向源文件,fw指向目标文件*/
char a,c; /*a用来接收用户给出的选择,c存放读取的字符*/
char str[50],path[50],in_name[50],out_name[50]; /*str用来存放读取
的文件名*/
int i,sele,s,flag=0; /*sele选择项目,s分割出子文件的数目,flag是开
关变量*/
long j,length; /*j当前读取的字节数,length每个子文件的字节数*/
int p=0,q=0; /*p,q用于检测要保存的文件的路径*/
a1:printf("1.分割文件 2.合并文件 0.退出\n");
printf("请选择:");
scanf("%d",&sele);
fflush(stdin);
if(sele==1) /*分割文件*/
{
a2:printf("请输入要分割的文件名(包含路径,直接回车则退出此项操作):\n");
gets(in_name);
if(in_name[0]=='\0')
return;
if((fr=fopen(in_name,"rb"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正
确。\n");
goto a2;
}
a3:printf("请输入分割后的子文件名(包含路径,不带扩展名,否则不能生成文件):\n");
scanf("%s",str);
sprintf(out_name,"%s.%0d",str,1);
flag=access(out_name,0);
fflush(stdin);
if(flag==0)
{
printf("您输入的子文件已经存在,是否覆盖?\n");
printf("Y->覆盖 其它键->重新输入 :");
a=getchar();
fflush(stdin);
if(a!='Y'&&a!='y')
goto a3; /*覆盖已存在的文件*/
}
flag=0;
a4:printf("请输入分割后的子文件大小(1-10240K字节之间,输入0终止
分割):\n");
scanf("%ld",&length);
fflush(stdin);
if(length==0)
{
printf("分割中断,按任意键继续...");
getch();
return;
}
printf("分割后是否要删除源文件?\n");
printf("Y->删除 其它键->不删除 :");
a=getchar();
if(a=='Y'||a=='y')
flag=1;
i=0;
if(length>=1&&length<=10240) /*开始分割*/
{
while(1)
{
i++;
printf("生成%s.%0d子文件\n",str,i);
sprintf(out_name,"%s.%0d",str,i);
fw=fopen(out_name,"wb");
j=0;
if(i==1)
fread(&c,sizeof(char),1,fr);
do
{
fwrite(&c,sizeof(char),1,fw);
fread(&c,sizeof(char),1,fr);
j++;
} while(!feof(fr)&&j覆盖 其它键->重新输入 :");
a=getchar();
fflush(stdin);
if(a!='Y'&&a!='y') /*不覆盖已存在的文件*/
goto a6;
}
flag=0;
printf("合并后是否要删除子文件?\n");
printf("Y->删除 其它键->不删除 :");
a=getchar();
if(a=='Y'||a=='y')
flag=1;
fw=fopen(out_name,"wb");
i=1;
sprintf(in_name,"%s.%0d",str,i);
for(i=1;(fr=fopen(in_name,"rb"))!=NULL;) /*开始合并*/
{
fclose(fr);
printf("合并子文件%s.%0d\n",str,i);
if((fr=fopen(in_name,"rb"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件
名是否正确。\n");
goto a5;
}
fread(&c,sizeof(char),1,fr);
do
{
fwrite(&c,sizeof(char),1,fw);
fread(&c,sizeof(char),1,fr);
} while(!feof(fr));
fclose(fr);
if(flag==1) /*需要删除源文件*/
unlink(in_name);
i++;
sprintf(in_name,"%s.%0d",str,i);
}
fclose(fw);
printf("合并结束!按任意键继续...\n");
getch();
}
else if(sele==0);
else
{
printf("无效选项,请重新选择。\n");
goto a1;
}
}
void passwd() /*文件加密函数*/
{
char in_name[50],out_name[50]; /*用户输入的要加密的文件名*/
char pwd[16],path[50]; /*pwd用来保存密码,path用来存放路径*/
char a; /*接收用户的选择*/
FILE *fr,*fw;
register char ch;
int j=0,i=0,flag; /*j用来标记所读取文件路径的结束点*/
printf("使用须知:\n");
printf("1、加密解密时密码只要求输入一次,以明文显示,请确认输入正确\n");
printf("2、解密时只需重新运行本程序即可\n");
printf("3、解密时若密码错误不给予提示,但无法得到原文件\n");
printf("4、本软件使用的加密算法较为简单,请不要用以加密重要文件\n");
a1:printf("请输入源文件名(包含路径,直接回车则退出此项操作):\n");
if(in_name[0]=='\0')
return;
gets(in_name); /*得到要加密的文件名*/
if((fr=fopen(in_name,"rb"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a1;
}
printf("请输入密码(1-16位):\n");
gets(pwd); /*得到密码*/
a2:printf("请输入生成的文件名(包含路径,直接回车则替换源文件):\n");
gets(out_name); /*得到加密后的文件名*/
if(strcmp(in_name,out_name)==0)
{
printf("您输入的新文件与源文件相同,请重新输入。\n");
goto a2;
}
if(out_name[0]=='\0') /*直接替换源文件*/
{
for(i=0;in_name[i]!='\0';i++)
if(in_name[i]==92)
j=i;
for(i=0;i<=j;i++)
path[i]=in_name[i];
path[i]='\0';
strcat(path,"tmp.tmp");
fw=fopen(path,"w");
i=0;
j=0;
while(pwd[++i]);
ch=fgetc(fr);
while(!feof(fr)) /*开始加密*/
{
fputc(ch^pwd[j>=i?j=0:j++],fw); /*异或后写入fw文件
*/
ch=fgetc(fr);
}
fclose(fr);
fclose(fw);
unlink(in_name);
rename(path,in_name);
}
else /*创建新文件*/
{
flag=access(out_name,0);
if(flag==0)
{
printf("目标文件已经存在,是否替换?\n");
printf("Y->替换 其它键->另输入文件名 :");
a=getchar();
fflush(stdin);
if(a!='Y'&&a!='y') /*不替换*/
goto a2;
}
flag=0;
if((fw=fopen(out_name,"wb"))==NULL)
{
printf("无法创建新文件,请确认磁盘空间未满且磁盘没有写保
护。\n");
goto a2;
}
while(pwd[++i]);
ch=fgetc(fr);
while(!feof(fr)) /*加密算法开始*/
{
fputc(ch^pwd[j>=i?j=0:j++],fw); /*异或后写入fp2文
件*/
ch=fgetc(fr);
}
fclose(fr);
fclose(fw);
}
printf("操作完成,按任意键继续...\n");
getch();
}
void _3in1(int sele) /*执行6,8,9功能函数*/ {
FILE *fr,*fw; /*fr:读文件 fw:写文件*/
char in_name[50],out_name[50],path[50]; /*path用来路径*/
char a; /*用来接收用户给出的选择*/
char buf[2]; /*定义2个字节缓存,搜索连续的2个字符*/
int i=0,k,flag; /*i标志变量,flag判断目标文件是否已经存在,k用来标记所读
取文件路径的结束点*/
a1:printf("请输入源文件名(包含路径,直接回车则退出此项操作):\n");
gets(in_name);
if(in_name[0]=='\0')
return;
if((fr=fopen(in_name,"r"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a1;
}
a2:printf("另存为(直接回车则替换源文件):\n");
gets(out_name);
if(strcmp(in_name,out_name)==0)
{
printf("您输入的新文件与源文件相同,请重新输入。\n");
goto a2;
}
if(out_name[0]=='\0') /*替换源文件*/
{
for(i=0;in_name[i]!='\0';i++)
if(in_name[i]==92)
k=i;
for(i=0;i<=k;i++)
path[i]=in_name[i];
path[i]='\0';
strcat(path,"tmp.tmp");
fw=fopen(path,"w");
i=0;
buf[i]=fgetc(fr);
while(!feof(fr))
{
if(sele==6) /*删除空行*/
{
if(!(buf[0]==10&&buf[1]==10))
fputc(buf[i],fw);
if(i)
i=0;
else
i=1;
}
else if(sele==8) /*CR/LF转自动换行*/
{
buf[1]=fgetc(fr);
fseek(fr,-1,1);
if(buf[i]==10&&buf[1]!=32);
else
fputc(buf[i],fw);
if(buf[1]==EOF)
break;
}
else if(sele==9) /*TAB转空格*/
{
if(buf[i]==9)
fputc(' ',fw);
else
fputc(buf[i],fw);
}
buf[i]=fgetc(fr);
}
fclose(fr);
fclose(fw);
unlink(in_name);
rename(path,in_name);
}
else /*另存为新文件*/
{
flag=access(out_name,0);
if(flag==0)
{
printf("目标文件已经存在,是否替换?\n");
printf("Y->替换 其它键->另输入文件名 :");
a=getchar();
fflush(stdin);
if(a!='Y'&&a!='y') /*不替换*/
goto a2;
}
if((fw=fopen(out_name,"w"))==NULL)
{
printf("无法创建新文件,请确认磁盘空间未满且磁盘没有写保
护。\n");
goto a2;
}
buf[i]=fgetc(fr);
while(!feof(fr))
{
if(sele==6) /*删除空行*/
{
if(!(buf[0]==10&&buf[1]==10))
fputc(buf[i],fw);
if(i)
i=0;
else
i=1;
}
else if(sele==8) /*CR/LF转自动换行*/
{
buf[1]=fgetc(fr);
fseek(fr,-1,1);
if(buf[i]==10&&buf[1]!=32);
else
fputc(buf[i],fw);
if(buf[1]==EOF)
break;
}
else if(sele==9) /*TAB转空格*/
{
if(buf[i]==9)
fputc(' ',fw);
else
fputc(buf[i],fw);
}
buf[i]=fgetc(fr);
}
fclose(fr);
fclose(fw);
}
printf("操作完成,按任意键继续...");
getch();
}
void change() /*大小写转换函数*/ {
char path[50],in_name[50],out_name[50];/*path存放路径*/
FILE *fr,*fw;
char ch;
int sele,i=0,k,flag; /*k用来标记所读取文件路径的结束点*/
a1:printf("1、大写->小写 2、小写->大写 0、退出\n");
printf("请选择:");
scanf("%d",&sele);
fflush(stdin);
if(sele==0)
return;
else if(sele>2||sele<0)
{
printf("无效选项,请重新选择。\n");
goto a1;
}
a2:printf("请输入文件名(包含路径,直接回车则退出此项操作):\n");
gets(in_name);
if(in_name[0]=='\0')
return;
if((fr=fopen(in_name,"r"))==NULL)
{
printf("没有找到文件,请检查您输入的路径和文件名是否正确。\n");
goto a2;
}
a3:printf("另存为(直接回车则替换源文件):\n");
gets(out_name);
if(strcmp(in_name,out_name)==0)
{
printf("您输入的新文件与源文件相同,请重新输入。\n");
goto a3;
}
if(out_name[0]=='\0') /*替换源文件*/
{
for(i=0;in_name[i]!='\0';i++)
if(in_name[i]==92)
k=i;
for(i=0;i<=k;i++)
path[i]=in_name[i];
path[i]='\0';
strcat(path,"tmp.tmp");
fw=fopen(path,"w");
i=0;
ch=fgetc(fr);
while(!feof(fr))
{
if(sele==1) /*大写->小写*/
fputc(ch>=65&&ch<=90?ch+32:ch,fw);
else if(sele==2) /*小写->大写*/
fputc(ch>=97&&ch<=122?ch-32:ch,fw);
ch=fgetc(fr);
}
fclose(fr);
fclose(fw);
unlink(in_name);
rename(path,in_name);
}
else /*另存为新文件*/
{
flag=access(out_name,0);
if(flag==0)
{
printf("目标文件已经存在,是否替换?\n");
printf("Y->替换 其它键->另输入文件名 :");
ch=getchar();
fflush(stdin);
if(ch!='Y'&&ch!='y') /*不替换*/
goto a3;
}
if((fw=fopen(out_name,"w"))==NULL)
{
printf("无法创建新文件,请确认磁盘空间未满且磁盘没有写保护。\n");
goto a3;
}
ch=fgetc(fr);
while(!feof(fr))
{
if(sele==1) /*大写->小写*/
fputc(ch>=65&&ch<=90?ch+32:ch,fw);
else if(sele==2) /*小写->大写*/
fputc(ch>=97&&ch<=122?ch-32:ch,fw);
ch=fgetc(fr);
}
fclose(fr);
fclose(fw);
}
printf("操作完成,按任意键继续...");
getch();
}
main()
{
int sele;
do
{
clrscr();
printf(" 文本文件处理 TxtEdit\n");
printf("============================\n");
printf("> 1、字数和单词统计\n");
printf("> 2、查找和替换\n");
printf("> 3、文件比较\n");
printf("> 4、文件分割合并\n");
printf("> 5、文件加密\n");
printf("> 6、删除文件多余空行\n");
printf("> 7、大小写转换\n");
printf("> 8、CR/LF转为自动换行\n");
printf("> 9、TAB转换成空格\n");
printf("> 0、结束操作\n");
printf("============================\n");
printf("敬告:该程序专为文本文件设计\n");
printf(" 虽然其中的某些功能也适用于其它类型的文件,\n");
printf(" 但由此若带来不良后果作者概不负责!\n");
printf("请输入您要执行的操作:");
scanf("%d",&sele);
fflush(stdin);
if(sele==1) /*字数和单词统计*/
character();
else if(sele==2) /*查找并替换*/
replace();
else if(sele==3) /*文件比较*/
compare();
else if(sele==4) /*文件分割合并*/
split();
else if(sele==5) /*文件加密*/
passwd();
else if(sele==6||sele==8||sele==9) /*删除文本文件多余空行,CR/LF
转为自动换行,TAB转换成空格*/
_3in1(sele);
else if(sele==7) /*大小写转换*/
change();
else if(sele>9||sele<0)
{
printf("无效项目,按任意键重新选择。\n");
getch();
}
}while(sele);
printf("操作结束,谢谢使用。\n");
}
本文档为【/*文本文件处理工具】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。