实现一个基于命令行的文本编辑器一.docx
- 文档编号:10586531
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:25
- 大小:48.25KB
实现一个基于命令行的文本编辑器一.docx
《实现一个基于命令行的文本编辑器一.docx》由会员分享,可在线阅读,更多相关《实现一个基于命令行的文本编辑器一.docx(25页珍藏版)》请在冰豆网上搜索。
实现一个基于命令行的文本编辑器一
实现一个基于命令行的文本编辑器
选择本项目作业的同学,必须本人独立完成。
功能:
1、打开文件
2、保存文件
3、能够对文件进行查找
4、能够对文件进行替换
5、能够对文件进行删除
要求:
1、不能使用Cstring.h,string等类,只能使用char*来处理字符串
2、能够动态的申请和分配内存
上交的内容:
1、.cpp、.h、.exe文件
2、文件命名规则:
学号.cpp学号.h学号.exe
程序具体要求:
1、在命令行下运行学号.exe出现界面如下
2、按输入参数
a)-ofilename打开文件
b)–h帮助信息,提示各个参数的格式和含义
c)–sfilename保存文件到filename指定的路径和文件名
d)–fstringtofind查找stringtofind字符串,并将查到的字符串的个数在屏幕上显示,并将个数写到文件学号_result.txt中,路径和最后-s中的filename同一个路径
e)–rsourcestringtargetstring替换字符串,将文件中的sourcestring替换成targetstring,将替换多少处显示在屏幕上,并将替换的个数和替换后的文本都写道学号_result.txt中,路径要求同上
f)–dstringtodelete删除字符串,将文件中的stringtodelete删除,将删除多少处显示在屏幕上,并将删除的个数和删除后的文本都写到学号_result.txt中,路径要求同上
g)–q退出程序
3、当前文件的问题:
sample:
打开了c:
\aaa.txt
在-d删除之后,再执行-r时是要在原来的aaa.txt上进行-r操作,即不受-d的影响
一旦执行了-s
当前的文件就变成了-s保存的结果
如:
打开c:
\aaa.txt
在-d删除之后,执行了-s
再执行-r时就是要在删除之后的文本上进行-r操作了
4、学号_result.txt
这个文件每次写都是在文件的最后追加,不要覆盖原来的内容
要求所有的次数独占一行,写法为:
-f10-r29-d3
所有的文本写完后空两行
sample:
源代码下载:
#include"stdio.h"
#include"stdlib.h"
structline{
chartext[81];
intnum;/*行号*/
structline*next;/*指向下一个输入项目的指针*/
structline*prior;/*指向前一个项目的指针*/
};
structline*start;/*指向表中第一个项目的指针*/
structline*last;/*指向表中作后一个项目的指针*/
structline*find(int),*dls_store(structline*);
voidpatchup(int,int),delete_text(),list(),save(char*),load(char*);
menu_select();
enter(intlinenum);
voidmain(intargc,char*argv[])
{
chars[80],choice,fname[80];
//structline*info;
intlinenum=1;
start=NULL;
last=NULL;
if(argc==2)load(argv[1]);/*装入命令行上的文件*/
do{
choice=menu_select();
switch(choice){
case1:
printf("\t行号:
");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case2:
delete_text();
break;
case3:
list();
break;
case4:
printf("\t文件名:
");
gets(fname);
save(fname);
break;
case5:
printf("\t文件名:
");
gets(fname);
load(fname);
break;
case6:
exit(0);
}
}while
(1);
}
/*显示菜单,供用户选择*/
menu_select()
{
chars[80];
intc;
printf("\t\t1.输入\n");
printf("\t\t2.删除一行\n");
printf("\t\t3.显示一行\n");
printf("\t\t4.文件存盘\n");
printf("\t\t5.装入文件\n");
printf("\t\t6.退出\n");
do{
printf("\n\n\t\t请按数字选择:
");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
/*将文本插在指定行端部*/
enter(intlinenum)
{
structline*info;
//chart[81];
for(;;){
/**/
info=(structline*)malloc(sizeof(structline));
if(!
info){
printf("\t!
内存不够!
\n");
return(NULL);
}
printf("%d:
",linenum);
gets(info->text);
info->num=linenum;
if(*info->text){
if(find(linenum))patchup(linenum,1);
if(*info->text)start=dls_store(info);
}
elsebreak;
linenum++;
}
return(linenum);
}
/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而*/
/*删除时,被删除的文本后面的行号必须减1*/
voidpatchup(intn,intincr)
{
structline*i;
i=find(n);
while(i){
i->num=i->num+incr;
i=i->next;
}
}
/*按行号排序后插入*/
structline*dls_store(structline*i)
{
structline*old,*p;
if(last==NULL){
i->next=NULL;
i->prior=NULL;
last=i;
return(i);
}
p=start;
old=NULL;
while(p){
if(p->num){
old=p;
p=p->next;
}
else{
if(p->prior){
p->prior->next=i;
i->next=p;
p->prior=i;
returnstart;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
returnstart;
}
/*删除一行*/
voiddelete_text()
{
structline*info;
chars[80];
intlinenum;
printf("\t行号:
");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info){
if(start==info){
start=info->next;
if(start)start->prior=NULL;
elselast=NULL;
}
else{
info->prior->next=info->next;
if(info!
=last)
info->next->prior=info->prior;
elselast=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
/*查找一行文本*/
structline*find(intlinenum)
{
structline*info;
info=start;
while(info){
if(linenum==info->num)return(info);
info=info->next;
}
return(NULL);
}
/*显示文本*/
voidlist()
{
structline*info;
info=start;
while(info){
printf("%d:
%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
}
/*存文件*/
voidsave(char*fname)
{
structline*info;
char*p;
FILE*fp;
if((fp=fopen("text.txt","w"))==NULL){
printf("\t文件打不开!
\n");
exit(0);
}
printf("\t正在存入文件:
\n");
info=start;
while(info){
p=info->text;
while(*p)putc(*p++,fp);
//putc('\r',fp);
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
/*装入文件*/
voidload(char*fname)
{
structline*info,*temp;
char*p;
FILE*fp;
//intt,size,inct;
intsize,inct;
if((fp=fopen("text.txt","r"))==NULL){
printf("\t文件打不开!
\n");
exit(0);
}
while(start){
temp=start;
start=start->next;
free(temp);
}
printf("\n\t正装入文件!
\n");
size=sizeof(structline);
start=(structline*)malloc(size);
if(!
start){
printf("\n\t内存已经用完!
");
return;
}
info=start;
p=info->text;
inct=1;
while((*p=getc(fp))!
=EOF){
p++;
while((*p=getc(fp))!
='\n')p++;
//getc(fp);/*丢掉'\n'*/
*p='\0';
info->num=inct++;
info->next=(structline*)malloc(size);
if(!
info->next){
printf("\n\t内存已经用完!
");
return;
}
info->prior=temp;
temp=info;
info=info->next;
p=info->text;
}
temp->next=NULL;
last=temp;
free(info);
start->prior=NULL;
fclose(fp);
}
按输入参数
a)-ofilename打开文件
b)–h帮助信息,提示各个参数的格式和含义
c)–sfilename保存文件到filename指定的路径和文件名
d)–fstringtofind查找stringtofind字符串,并将查到的字符串的个数在屏幕上显示,并将个数写到文件学号_result.txt中,路径和最后-s中的filename同一个路径
e)–rsourcestringtargetstring替换字符串,将文件中的sourcestring替换成targetstring,将替换多少处显示在屏幕上,并将替换的个数和替换后的文本都写道学号_result.txt中,路径要求同上
f)–dstringtodelete删除字符串,将文件中的stringtodelete删除,将删除多少处显示在屏幕上,并将删除的个数和删除后的文本都写到学号_result.txt中,路径要求同上
g)–q退出程序
这个大概该怎么实现,怎么能输入多次指令呢?
我之前编写的简单程序都是执行完就马上关闭的,这该怎么实现?
?
我来帮他解答
满意回答
2012-11-2802:
02
这不算文本编辑器吧。
说一下我的思路:
用一个二维数组保存参数,charcmd[N][M]={"-o","-h"........};
然后根据用户输入的参数执行相应的操作,
charch[3];
while
(1)
{
scanf("%s",ch);
//判断参数输入是否正确,如果不正确做相应的处理
switch(ch[1])
{
case'o':
//打开文件,调用子程序
case'h':
//获取帮助,调用子程序
...............
case'q':
//退出程序
}
}
追问
我要打开某个文件呢比如-oabc.txt那这个文件名在哪里读入啊要求是一次键入-ofilename怎么做呢
回答
文件名用字符数组保存,读入然后判断就可以了。
追问
保存参数有什么用啊
回答
不定义变量你输入的值放在哪里。
追问
输入语句把要打开的文件名存放在数组当中
然偶再用fopen来打开这个文件该怎么做
是这样吗
charfilename[50]
......
fopen("filename.txt","r")吗
回答
对
0|评论
求助知友
记住一座城|当前分类:
18级排名:
506
擅长C/C++:
18级排名:
506|来自团队玩转C
提问者对回答的评价:
你真棒,学习了
按默认排序|按时间排序
其他回答共2条
2012-11-2923:
27naska777|当前分类:
7级
main函数式是可以带命令行参数的,不知道你在什么环境下编程,linux的例子如下:
intmain(intargc,char*argv[])
{
inti;
for(i=0;i switch(argv[i]){ case"-o": 文件名为argv[++i],自己想办法打开 case"-h": 打印帮助信息 ……以此类推 } } } 编译好后的程序假设名为a.out,那么可以在命令行中输入a.out-h来打印帮助信息,也可以连续输入多个参数,比如a.out-ofile.txt-fhelp,那么将会打开文件file.txt并查找help这个字符串(具体程序会做什么要你自己在main函数中解析,我只是举个例子) 0|评论 2012-11-2801: 38aiqiang930|当前分类: 4级 voidmain() { data while (1) { scanf("%d",&data); //这里判断输入的data变量 } } 外面写不同的处理函数 #include #include #pragmaargsused boolopenfile(FILE*f,char*filename); voidsavefile(FILE*f,char*type,int*p); intfindstr(FILE*f,char*str); int*replace(FILE*f,char*s,char*d); int*deletefile(FILE*f,char*s); char*fenli(char*s); intmain(intargc,char*argv[]) { char*sel=newchar[50]; charrecord; int*mpos; char*fname,*fn2; fname=&sel[2]; FILE*in; while (1) { cout<<"-"; gets(sel); switch(sel[0]) { case'h': cout<<"帮助信息: "< cout<<"-ofilename打开文件"< cout<<"–h帮助信息,提示各个参数的格式和含义"< cout<<"–sfilename保存文件到filename指定的路径和文件名"< cout<<"–fstringtofind查找stringtofind字符串,并将查到的字符串的个数在屏幕上显示,并将个数写到文件学号_result.txt中,路径和最后-s中的filename同一个路径"< cout<<"–rsourcestringtargetstring替换字符串,将文件中的sourcestring替换成targetstring,将替换多少处显示在屏幕上,并将替换的个数和替换后的文本都写道学号_result.txt中,路径要求同上"< cout<<"–dstringtodelete删除字符串,将文件中的stringtodelete删除,将删除多少处显示在屏幕上,并将删除的个数和删除后的文本都写到学号_result.txt中,路径要求同上"< cout<<"q退出程序"< record='h'; break; case'q': return0; case'o': if(! openfile(in,fname)) { cout<<"打开文件错误! "< exit (1); } cout<<"打开文件成功"< record='o'; break; case's': switch(record) { case'r': savefile(in,fn2,mpos); break; case'd': savefile(in,"",mpos); break; default: break; } break; case'f': cout<<"总共找到了"< break; case'r': for(inti=0;i<50;i++) { if(fname[i]=='') fn2=&sel[i+2]; } mpos=replace(in,fname,fn2); cout<<"总共替换了"< break; case'd': mpos=deletefile(in,fname); cout<<"总共删除了"< break; default: break; } } return0; } //--------------------------------------------------------------------------- boolopenfile(FILE*f,char*filename) { f=fopen(filename,"r+"); returnf; } voidsavefile(FILE*f,char*type,int*p) { if(! f) { cout<<"操作文件失败"; exit (1); } intt=sizeof(p)/sizeof(*p);//计算数组有好大? for(inti=0;i { fseek(f,p[i],0); fputs(type,f); } fclose(f); } intfindstr(FILE*f,char*str) { if(! f) { cout<<"没有文件,异常退出"< return-1; } char*temp=newchar[strlen(str)]; intcount=0; longinti=0; while(! fgets(temp,strlen(str),f)) { if(strcmp(temp,str)==0) count++; i++; fseek(f,i,0); } FILE*re; if((f=fopen("_result.txt","a+"))==NULL) { cout<<"没有文件,异常退出"< return-1; } fputs("-f",re); fputc(count,re); fputc('\n',re); fputc('\n',re); fclose(re); deletetemp; returncount; } int*replace(FILE*f,char*s,char*d) { if(! f) { cout<<"没有文件,异常退出"< return0; } intcount=0; char*temp=newchar[strlen(s)]; longintn=0; while(! fgets(temp,strlen(s),f)) { n++; if(strcmp(temp,s)==0) count++; fseek(f,n,0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 一个 基于 命令行 文本 编辑器