039.简单的文本编辑器

简介: 039.简单的文本编辑器
#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;
}
相关文章
|
设计模式 Java 数据库连接
只要100行代码,实现文本编辑器中的草稿箱功能
大家都用过网页中的富文本编辑器,编辑器通常都会附带草稿箱、撤销等操作。下面用一段代码来实现一个这样的功能。假设,我们在GPer社区中发布一篇文章,文章编辑的过程需要花很长时间,中间也会不停地撤销、修改,甚至可能要花好几天才能写出一篇精品文章,因此可能会将已经编辑好的内容实时保存到草稿箱。
141 1
|
17天前
|
Java 开发工具 C语言
文本编辑器
文本编辑器。
32 4
|
5月前
|
程序员 Linux 开发工具
为什么vim是程序员最喜欢的文本编辑器之一
为什么vim是程序员最喜欢的文本编辑器之一
47 0
|
6月前
|
程序员 Linux 项目管理
为什么vim是程序员最喜欢的文本编辑器之一?
为什么vim是程序员最喜欢的文本编辑器之一?
|
8月前
|
IDE 开发工具 Windows
EmEditor文本编辑器
Emurasoft文本编辑器是一款功能强大且非常好用的文本编辑器!它启动速度快,可以完全代替Windows自带的记事本,足以胜任日常的文本编辑工作。良好地支持Unicode和中文字符,
41 0
|
8月前
|
JavaScript
html+css+js实现文本编辑器
html+css+js实现文本编辑器
90 0
|
Unix Linux 开发工具
常见文本编辑器
常见文本编辑器
131 0
|
安全 程序员 Windows
EverEdit|文本编辑器
EverEdit|文本编辑器
1061 0

热门文章

最新文章