文档编辑器的设计与实现

(一) 系统的基本功能
该系统要求以文本文件存储一文件,对文件中的内容进行各种操作,具体地,要能提供以下几个功能:
a. 文件标准化处理:如果句子有前导空格和后导空格,则删除这些空格,单词与单词之间只保留一个空格。
b. 统计功能:可方便地统计出文档中出现次数最多和最少的字符串。
c. 查找与替换功能:能够查找任意一个字符串在文档中出现的次数,并可以选择全部将其替换为另一个字符串。
d. 显示功能:编辑完成后可以显示编辑后的文档。
e. 抽取功能:根据要求将文件中的某一类字符抽取,并存入另外的文件,如抽取所有的数字、抽取所有的字母等
f. 用字符屏幕实现以下功能:
特定大小的文本显示窗口并显示指定的文件
设置文本窗口背景和指定字符串的颜色(如将文件中的某一字符串全部显示为红色等)
将文本窗口那特定据矩形域内的文字拷贝至文件中(矩形域由矩形的左上坐标和右下坐标决定)
(二) 程序设计的具体要求
(1) 数据结构
主要是对文件进行操作。字符屏幕的相关函数在<conio.h>中
(2) 程序模块及函数功能
① 显示文件:void list();
② 查找指定字符串:void selectstring();
③ 替换字符串:void replacestring();
④ 抽取信息:void extracttxt();
⑤ 字符屏幕操作:void myscreen();
(3) 菜单结构:

菜 单
0、退出
1、显示文件信息
2、统计
3、查找
4、替换
5、抽取
6、字符屏幕设置(大小、颜色)
7、字符串颜色设置
8、文本拷贝
(4) 界面友好
我的邮箱 [email protected]

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 1000
#define N 30
void menu();
void tongji(char *sFile) ;
int y(char ch1[],char ch2[]);
void biaozun(char *sFile);
void menu1();
void list();
int x(char ch1[],char ch2[]) ;
void replacestring(char *sFile);
void selectstring(char *sFile);
void extracttxt(char *sFile);
void biaozunhua(char *sFile);
int main()
{
char sFile[20];
int i,a;
FILE *fp;
printf("********请输入文件********\n");
scanf("%s",sFile);
fp=fopen(sFile,"r");
biaozunhua(sFile);
biaozun(sFile);
do
{
do
{
menu() ;
printf("********请选择的操作********\n");
scanf("%d",&i);
}while(i<=0&&i>=5);
switch(i)
{
case 0: return 0;
case 1: list() ; break;
case 2: tongji(sFile);break;
case 3: selectstring(sFile) ; break;
case 4: replacestring(sFile) ; biaozun(sFile); break;
case 5:extracttxt(sFile) ; break;
}
menu1();
printf("********请选择的操作********\n");
scanf("%d",&a);
}while(a==1);
return 0;
}
/****************************************************************/
/******************************菜单******************************/
void menu1()
{
printf("********1. 返回菜单********\n");
printf("********按其他键退出********\n");
}
void menu()
{
printf("********0. 退出********\n");
printf("********1. 显示文件信息********\n");
printf("********2. 统计********\n");
printf("********3. 查找********\n");
printf("********4. 替换********\n");
printf("********5. 抽取********\n");
}
/****************************************************************/
/******************************显示文件******************************/

void list()
{

char ch,sFile[N];
FILE *fp;
printf("********请输入显示的文件名********\n");
scanf("%s",sFile);
fp=fopen(sFile,"r");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
while((ch=fgetc(fp))!=EOF)
{
putchar(ch);
}
printf("\n");
fclose(fp);
}

/****************************************************************/
/******************************查找指定字符串******************************/
void selectstring(char *sFile)
{
char str[N],ch1[M];
int n,m,i,j,k,count=0;
FILE *fp;
fp=fopen(sFile,"r");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
while((fgets(ch1,1000,fp))!=NULL)
{
}
printf("********输入你想要查找的字符!********\n");
scanf("%s",str);
n=strlen(ch1);
m=strlen(str);
for(i=0;i<=(n-m);i++)
{
for(k=i,j=0;j<m;k++,j++)
{
if(ch1[k]!=str[j])
break;
}
if(j==m)
count++;
}
if(count==0)
printf("********没有找到你想要查找的字符!********\n");
else
printf("********你想要查找的字符串有%d个********\n",count);
fclose(fp);
}

/****************************************************************/
/******************************抽取信息******************************/
void extracttxt(char *sFile)
{
char ch,dFile[N];
int i;
FILE *fp,*fp1;
printf("********输入存放抽取字符文件名********\n");
scanf("%s",dFile);
fp=fopen(sFile,"r" );
fp1=fopen(dFile,"w");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
if(!fp1)
{
printf("文件无法打开!\n");
exit(1);
}
printf("********0. 抽取字母********\n");
printf("********1. 抽取数字********\n");
do
{
scanf("%d",&i);
}while(i!=0&&i!=1);
switch(i)
{
case 0 :{while((ch=fgetc(fp))!=EOF)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
fputc(ch,fp1);
}
}; break;
case 1 :{while((ch=fgetc(fp))!=EOF)
{
if(ch>='0'&&ch<='9')
fputc(ch,fp1);
}
};break;

}
fclose(fp);
fclose(fp1);
}

/****************************************************************/
/******************************文件标准化******************************/
void biaozunhua(char *sFile)
{
char ch1[M],*p=ch1,ch;
int i=0,a=0;
FILE *fp,*fp1;
fp=fopen(sFile,"r");
fp1=fopen("D:\\中间文件.txt","w");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
if(!fp1)
{
printf("文件无法打开!\n");
exit(1);
}
while((ch=fgetc(fp))!=EOF)
{
if(ch=='\n')
{
ch=' ';
*(p+i)=ch;
}
*(p+i)=ch;
i++;
}
*(p+i)='\0';
for(i=0;ch1[i]==32;)
{
for(a=0;ch1[a]!='\0';a++)
*(p+a)=*(p+1+a);
}
for(i=0;ch1[i]!='\0';i++)
{
for(;ch1[i]!=32;i++);
if(ch1[i]==' '&&ch1[i+1]==' ')
{
for(a=i;ch1[a]!='\0';a++)
*(p+a)=*(p+1+a);
i=i-1;
}
}
fputs(ch1,fp1);
fclose(fp);
fclose(fp1);
}
void biaozun(char *sFile) //标准化
{
char ch1[M];
FILE *fp,*fp1;
fp=fopen(sFile,"w");
fp1=fopen("D:\\中间文件.txt","r");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
if(!fp1)
{
printf("文件无法打开!\n");
exit(1);
}
while((fgets(ch1,1000,fp1))!=NULL)
{
}
fputs(ch1,fp);
fclose(fp);
fclose(fp1);
}

/****************************************************************/
/******************************替换******************************/
void replacestring(char sFile[])
{
char ch2[N],ch1[M],ch3[N];
int i,n,m,k,a,j,b,c,q;
FILE *fp,*fp1;
fp=fopen(sFile,"r");
fp1=fopen("D:\\中间文件.txt","w");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
if(!fp1)
{
printf("文件无法打开!\n");
exit(1);
}
while((fgets(ch1,M,fp))!=NULL)
{
}
printf("********输入你想要被替换和替换的的字符!********\n");
printf("输入被替换的字符串:"); scanf("%s",ch2);
printf("\n");
printf("输入替换的字符串:"); scanf("%s",ch3);
n=strlen(ch2);
m=strlen(ch3);
k=x(ch1,ch2);
while(k!=(-1))
{
if(m-n>=0)
{
a=m-n;
for(i=(strlen(ch1)+20);i>=k+n;i--)
ch1[i+a]=ch1[i];
for(j=k,b=0;b<m;b++,j++)
ch1[j]=ch3[b];
}
if(n-m>0)
{
q=n-m;
for(c=k;c<(strlen(ch1)+6);c++)
ch1[c]=ch1[c+q];
for(j=k,b=0;b<m;b++,j++)
ch1[j]=ch3[b];
}
k=x(ch1,ch2);
}
fputs(ch1,fp1);
fclose(fp);
fclose(fp1);
}
int x(char ch1[],char ch2[]) //替换的辅助函数
{
int n,m,i,j,k;
n=strlen(ch1);
m=strlen(ch2);
for(i=0;i<=(n-m);i++)
{
for(k=i,j=0;j<m;k++,j++)
{
if(ch1[k]!=ch2[j])
break;
}
if(j==m)
return i;
}

return (-1);
}
/****************************************************************/
/******************************统计******************************/
void tongji(char *sFile)
{
char ch1[M],ch2[N];
int i=0,max,min,t,j=0;
FILE *fp;
fp=fopen(sFile,"r");
if(!fp)
{
printf("文件无法打开!\n");
exit(1);
}
while((fgets(ch1,1000,fp))!=NULL)
{
}
while(ch1[j]!=32)
{

ch2[i]=ch1[j];
i++;
j++;
}
ch2[i]='\0';
max=y(ch1,ch2);
i=0;
j=j+1;
while(ch1[j]!=32)
{
ch2[i]=ch1[j];
i++;
j++;
}
ch2[i]='\0';
t=y(ch1,ch2);
if(t>max)
{
min=max;
max=t;
}

if(t<=max)
min=t;
while(ch1[j]!='\0')
{
i=0;
j=j+1;
while((ch1[j]!=32)&&(ch1[j]!='\0'))
{
ch2[i]=ch1[j];
i++;
j++;
}
ch2[i]='\0';
t=y(ch1,ch2);
if(max<t)
max=t;
if(t<min)
min=t;
}
printf("字符串出现最多的次数是:%d 次\n",max);
printf("字符串出现最少的次数是:%d 次\n",min);
}
int y(char ch1[],char ch2[])
{
int n,m,i,j,k,count=0;
n=strlen(ch1);
m=strlen(ch2);
for(i=0;i<=(n-m);i++)
{
for(k=i,j=0;j<m;k++,j++)
{
if(ch1[k]!=ch2[j])
break;
}
if(j==m)
count++;
}
return count;
}
/****************************************************************/追问

太差了,我不喜欢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-26
不j用自己d设计2了v,伤脑细胞的,VC为1你写了l个v编辑器了r。创建一m个h单文7档程序,继承CEditView即可 在加入konopendocument BOOL CCPPTextEditDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; CStdioFile txtFile; txtFile。Open(lpszPathName, CFile::modeRead); if(txtFile。m_hFile == INVALID_HANDLE_VALUE) { AfxMessageBox(TEXT("文4件无p效")); } CString strRead,strTemp; while( txtFile。ReadString(strTemp) ) strRead += strTemp; txtFile。Close(); reinterpret_cast<CEditView*>(m_viewList。GetHead())->SetWindowText(strRead。GetBuffer()); return TRUE; }jㄥrǐyッⅥuㄛs博追问

就是要自己做一个啊!太难了!