#include <stdio.h>
#define MAXLEN 80
#define MAXLINE 200
char buffer[MAXLEN],fname[120];
char *lineptr[MAXLINE];
FILE *fp;
void edit(),replace(),insert(),delete(),quit();
char comch[]="EeRrIiDdQq";/*命令符*/
void(*comfun[])()={edit,replace,insert,delete,quit};/*对应处理函数*/
int modified=0,/*正文被修改标志*/last;/*当前正文行数*/
char *chpt;/*输入命令行字符指针*/main()
{int j;last=0;while(1){printf("\nInput a command:[e,r,i,d,q].\n");gets(buffer);/*读入命令行*/for(chpt=buffer;*chpt==''||*chpt=='\t';chpt++);/*掠过空白符*/if(*chpt=='\0') continue;/*空行重新输入*/for(j=0;comch[j]!='\0'&&comch[j]!=*chpt;j++);/*查命令符*/if(comch[j]=='\0') continue;/*非法命令符*/chpt++;/*掠过命令符,指向参数*/(*comfun[j/2])();/*执行对应函数*/fprintf(stdout,"The text is:\n");for(j=0;j<last;j++)/*显示正文*/fputs(lineptr[j],stdout);}
}
void quit()
{int c;if(modified)/* 如正文被修改 */{printf("Save? (y/n)");while(!(((c=getchar())>='a'&&c<='z')||(c>='A'&&c<='Z')));if(c=='y'||c=='Y')save(fname); /* 保存被修改过的正文 */}for(c=0;c<last;c++)free(lineptr[c]); /* 释放内存 */exit(0);
}void insert()
{int k,m,i;sscanf(chpt,"%d%d",&k,&m); /* 读入参数 */if(m<0||m>last||last+k>=MAXLINE)/* 检查参数合理性 */{printf("Error!\n");return;}for(i=last;i>m;i--)/* 后继行向后移 */lineptr[i+k-1]=lineptr[i-1];for(i=0;i<k;i++)   /* 读入k行正文,并插入 */{fgets(buffer,MAXLEN,stdin);lineptr[m+i]=(char *)malloc(strlen(buffer)+1);strcpy(lineptr[m+i],buffer);}last+=k;  /* 修正正文行数 */modified=1;    /* 正文被修改 */
}void delete()
{int i,j,m,n;sscanf(chpt,"%d%d",&m,&n);   /* 读入参数 */if(m<=0||m>last||n<m)   /* 检查参数合理性 */{printf("Error!\n");return;}if(n>last)n=last;        /* 修正参数 */for(i=m;i<=n;i++)  /* 删除正文 */free(lineptr[i-1]);for(i=m,j=n+1;j<=last;i++,j++)lineptr[i-1]=lineptr[j-1];last=i-1; /* 修正正文行数 */modified=1;    /* 正文被修改 */
}void replace()
{int k,m,n,i,j;sscanf(chpt,"%d%d%d",&k,&m,&n);    /* 读入参数 */if(m<=0||m>last||n<m||last-(n-m+1)+k>=MAXLINE)/* 检查参数合理性 */{printf("Error!\n");return;}/* 先完成删除 */if(n>last)n=last;     /* 修正参数 */for(i=m;i<=n;i++)  /* 删除正文 */free(lineptr[i-1]);for(i=m,j=n+1;j<=last;i++,j++)lineptr[i-1]=lineptr[j-1];last=i-1;/* 以下完成插入 */for(i=last;i>=m;i--)lineptr[i+k-1]=lineptr[i-1];for(i=0;i<k;i++){fgets(buffer,MAXLEN,stdin);lineptr[m+i-1]=(char *)malloc(strlen(buffer)+1);strcpy(lineptr[m+i-1],buffer);}last+=k;   /* 修正正文行数 */modified=1;    /* 正文被修改 */
}save(char *fname)  /* 保存文件 */
{int i;FILE *fp;if((fp=fopen(fname,"w"))==NULL){fprintf(stderr,"Can't open %s.\n",fname);exit(1);}for(i=0;i<last;i++){fputs(lineptr[i],fp);free(lineptr[i]);}fclose(fp);
}void edit()    /* 编辑命令 */
{int i;FILE *fp;i=sscanf(chpt,"%s",fname);   /* 读入文件名 */if(i!=1){printf("Enter file name.\n");scanf("%s",fname);}if((fp=fopen(fname,"r"))==NULL) /* 读打开 */{fp=fopen(fname,"w"); /* 如不存在,则创建文件 */fclose(fp);fp=fopen(fname,"r");   /* 重新读打开 */}i=0;while(fgets(buffer,MAXLEN,fp)==buffer){lineptr[i]=(char *)malloc(strlen(buffer)+1);strcpy(lineptr[i++],buffer);}fclose(fp);last=i;
}

039.简单的文本编辑器相关推荐

  1. python源码编译 带tkinter_python通过Tkinter库实现的一个简单的文本编辑器源码

    下边资料是关于python通过Tkinter库实现的一个简单的文本编辑器的内容. from tkSimpleDialog import askstring from tkFileDialog impo ...

  2. 【Qt】简单QT文本编辑器

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计 04. 软件测试 05. 预留 06. 附录 01. 概述 实现基本的文本编辑功能. 02. 开发环境 Wind ...

  3. python实现文本编辑器_Python-tkinter实现简单的文本编辑器

    Python-tkinter实现简单的文本编辑器 利用tkinter实现简单的文本编辑器.创建一个简单的文本编辑器.可以用读文件的方式在一个文本域里显示一些文字供用户编辑. 当用户退出程序时(通过 Q ...

  4. C++程序设计:原理与实践(进阶篇)15.6 实例:一个简单的文本编辑器

    15.6 实例:一个简单的文本编辑器 列表最重要的性质就是可以在不移动元素的情况下对其进行插入或删除操作.下面我们通过一个例子来说明这一点.考虑应该如何在文本编辑器中表示一个文本文件中的字符.所选用的 ...

  5. C语言项目实战之简单的文本编辑器

    预期实现三个功能,第一,可以对指定的行输入字符串:第二,删除指定行的字符串:第三,显示编辑器的行数和内容. 我们通过块链结构来实现本程序."块"的含义是每个块中可以存放多个字符,& ...

  6. gtk设计简单的文本编辑器(1)

    2019独角兽企业重金招聘Python工程师标准>>> 这是在windows下用gtk+glade+codeblocks设计的一个简单的文本编辑器. 功能:在文本视图内编辑文本后,在 ...

  7. 简单的文本编辑器C语言实现

    1.程序功能: 1.文章内容输入(可输入多行文字)2.显示当前文章内容3.进入文章内容统计菜单(包括总字数,大写字母个数,小写字母个数,数字个数,标点符号个数)4.查找文章中的字符或者字符串(显示出现 ...

  8. js简单的文本编辑器(所见即所得)

    项目页面需要一个简单的文本编辑器,网上的那些富文本编辑器功能都很强大,很多东西用不到,所以自己用js写了一个简单的文本编辑器. 代码如下: <!DOCTYPE html PUBLIC " ...

  9. python通过Tkinter库实现的一个简单的文本编辑器源码

    下边资料是关于python通过Tkinter库实现的一个简单的文本编辑器的内容. from tkSimpleDialog import askstring from tkFileDialog impo ...

最新文章

  1. 背包问题概述(Lintcode- 562.Backpack IV问题解决)
  2. 让按钮倒计时5秒以后才能再次点击提交 倒计时按钮
  3. eeglab中文教程系列(10)-利用光谱选项绘制ERP图像
  4. 我说分布式事务之消息最终一致性事务(二):RocketMQ的实现
  5. log4net在winform中release后不工作的原因
  6. 这声音酥了!萌妹程序员鼓励师24小时在线陪你写代码,给我吹爆这个VSCode插件...
  7. python atm作业详解_python day4 作业 ATM
  8. IFrame语法:IFrame实例应用集
  9. 删除用户账号的命令 mysql_【Mysql】常用指令之——用户操作(创建,授权,修改,删除)...
  10. 深度报告 | 4G应用启示录与5G应用展望
  11. 双交换消元:模合数多项式矩阵行列式、新伴随矩阵算法
  12. java后台解析json并保存到数据库_java解析json格式文件,再保存在数据库怎么做?...
  13. 基于树莓派的智能门禁及3D外壳打印设计
  14. With...As 用法--公用表达式
  15. 中文词性标注学习笔记(一)---词性标注概念
  16. 帝国CMS模板,免费帝国CMS模板,帝国CMS建站教程
  17. 通过‘PyQt6‘中的QWidget类创建一个含有按钮的窗口 1
  18. Windows编译x264
  19. 架设PPPOE服务器
  20. WebSocket菜鸟教程

热门文章

  1. yaourt 之 Curl 错误
  2. 如何招聘软件测试,ÈçºÎÕÐƸµ½µÄÈí¼þ²âÊÔ¹¤³Ìʦ£¿
  3. Windows自带虚拟化服务工具Hyper-V学习了解和实操
  4. Mac安装truffle框架时出现✓ Preparing to download box ✖ Downloading Unbox failed! Error: connect的解决方法
  5. 微信运营必备!专业的微信粉丝和社群管理工具!功能强大好用,而且免费!
  6. 蓝牙4.0和3.0区别
  7. mac chrome 常用插件
  8. 船长就是法律!古代海盗残酷刑罚
  9. matplotlib 不显示图像或者图像只能在弹出层显示
  10. 新建银行账户类,实现基本的属性和方法。