实现一个基于命令行文本编辑器【一】.doc

上传人:wj 文档编号:67467 上传时间:2023-04-28 格式:DOC 页数:14 大小:60.50KB
下载 相关 举报
实现一个基于命令行文本编辑器【一】.doc_第1页
第1页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第2页
第2页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第3页
第3页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第4页
第4页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第5页
第5页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第6页
第6页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第7页
第7页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第8页
第8页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第9页
第9页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第10页
第10页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第11页
第11页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第12页
第12页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第13页
第13页 / 共14页
实现一个基于命令行文本编辑器【一】.doc_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实现一个基于命令行文本编辑器【一】.doc

《实现一个基于命令行文本编辑器【一】.doc》由会员分享,可在线阅读,更多相关《实现一个基于命令行文本编辑器【一】.doc(14页珍藏版)》请在冰点文库上搜索。

实现一个基于命令行文本编辑器【一】.doc

实现一个基于命令行的文本编辑器

选择本项目作业的同学,必须本人独立完成。

功能:

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:

源代码下载:

/2013/01/04/169/

#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//在我的编译器下,不能使用printf进行输出,所以,需要你自己将流试输出改

#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同一个路径"<

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2