花了几天,从没有思路到写完。因为是第一次写这种命令交互式的,所以bug会很多。

格式:E/e:指定要编辑的文件

   Q/q:结束编辑

   R/r(用r命令后继的k行正文代替原始正文中的m行到n行)

    R  k m n

     k行正文

   I/i(将i命令后继的k行正文插入到原始正文第m行之后)

    I k m

     k行正文

   D/d(将原始正文中的第m行到第n行的正文内容删除)

    D m n

这是我写的代码:

  1 /* 实现简单的文本编辑器 */
  2 /* bug1:先按e,再按文件名,循环后ch还是等于'\n' */
  3 /* bug2:插入函数中,要是正文的一行最后不是回车的话,则插入的第一行会在所插的那一行上面,没有分开 */
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <string.h>
  7
  8 #define    CHMAX    80    /* 一行最多80个字符 */
  9 #define    LINEMAX    200    /* 最多允许200行 */
 10
 11 char command[] = "EeRrIiDdQq";    /* 可选择的命令 */
 12 char buffer[CHMAX];            /* 输入的缓冲区 */
 13 char *Line[LINEMAX];    /* 行指针,用来输入一行 */
 14 char *chpt;    /* 获取命令及参数的字符指针 */
 15 char filename[256];    /* 输入的文件名 */
 16 int modified = 0;    /* 修改标志 */
 17 int last;    /* 文本的最后一行,没有内容 */
 18 void Edit(), Replace(), Insert(), Delete(), Quit();
 19 void (*comfunc[])() = {Edit, Replace, Insert, Delete, Quit};    /* 函数指针数组 */
 20 void call();
 21
 22 int main(void)
 23 {
 24     call();
 25     return 0;
 26 }
 27
 28 void call()
 29 {
 30     int    j = 0;
 31     char    ch;
 32     last = 0;
 33
 34     while (1)
 35     {
 36         j = 0;
 37         printf("Input a command: [e,r,i,d,q]\n");
 38
 39         /* bug1 */
 40         //ch = ' ';
 41         //fflush(stdin);
 42         while ((ch = fgetc(stdin)) != '\n')        /* 输入命令 */
 43         {
 44             buffer[j] = ch;
 45             j++;
 46         }
 47         buffer[j] = '\0';
 48
 49         for (chpt = buffer; *chpt == ' ' || *chpt == '\t'; chpt++)    /* 跳过空白符 */
 50             ;
 51
 52         if (*chpt == '\0')
 53         {
 54             printf("Doesn't input any command\n");
 55             continue;
 56         }
 57
 58         for (j = 0; command[j] != *chpt && command[j] != '\0'; j++)    /* 获取命令的序号 */
 59             if (command[j] == '\0')
 60             {
 61                 printf("Cannot find command.\n");
 62                 continue;
 63             }
 64         chpt++;            /* 指向参数 */
 65         (*comfunc[j/2])();    /* 执行相应的函数 */
 66
 67         printf("The text is:\n");
 68         for (j = 0; j < last; j++)    /* 输出text的内容 */
 69             fputs(Line[j], stdout);
 70     }
 71
 72 }
 73
 74 void Edit()
 75 {
 76     int    i;
 77     FILE    *fp_temp;    /* 临时的文件指针 */
 78
 79     i = sscanf(chpt, "%s", filename);    /* sscnaf函数返回值是参数的个数,参数应当只有一个 */
 80
 81     if (i != 1)    /* 没有输入文件名或者输入超过一个文件名 */
 82     {
 83         printf("not input filename or more than 1 file, please input filename again:\n");
 84         scanf(" %s", filename);
 85     }
 86
 87     /* 打开指定文件,没有就创建新的文件 */
 88     if ((fp_temp = fopen(filename, "r")) == NULL)    /* 没有这个文件,则创建新的文件 */
 89     {
 90         if ((fp_temp = fopen(filename, "w")) == NULL)/*  创建新的文件 */
 91         {
 92             printf("Cannot create a new file");
 93             return;
 94         }
 95         fclose(fp_temp);
 96         if ((fp_temp = fopen(filename, "r")) == NULL)
 97         {
 98             printf("Cannot read");
 99             return;
100         }
101     }
102
103     i = 0;
104     while ((fgets(buffer, CHMAX, fp_temp)) == buffer)    /* 不用担心buffer越界问题,因为接下来没有使用到buffer */
105     {
106         Line[i] = (char *)malloc((strlen(buffer)) + 1);
107         strcpy(Line[i], buffer);
108         i++;
109     }
110     last = i;
111
112     fclose(fp_temp);
113     modified = 1;    /* 已修改 */
114 }
115
116 void Replace()
117 {
118     int    i, k, m, n;    /* 将k行正文替换到第m行和第n行中 */
119
120     if (modified != 1)
121     {
122         printf("Did not open a file.\n");
123         return;
124     }
125
126     i = sscanf(chpt, "%d%d%d", &k, &m, &n);
127     if (i != 3 || m < 0 || n < 0 || k < 0 || m > n || n > last || k > last)
128     {
129         printf("format error\n");
130         return;
131     }
132
133
134     if (k != (n-m+1))
135     {
136         printf("error number of lines replaced.\n");
137         return;
138     }
139
140     /* 写k行正文 */
141     printf("Please input %d line words:\n", k);
142
143     /* 替换 */
144     for (i = 0; i < k; i++)
145     {
146         free(Line[m+i-1]);
147         fgets(buffer, CHMAX, stdin);
148         Line[m+i-1] = (char *)malloc(strlen(buffer) + 1);
149         strcpy(Line[m+i-1], buffer);
150     }
151
152     modified = 1;
153 }
154
155 void Insert()
156 {
157     int    i, k, m;    /* 将k行正文插入到原始正文第m行之后 */
158
159
160     if (modified != 1)    /* Edit最后修改modified标志 */
161     {
162         printf("Did not open a file.\n");
163         return;
164     }
165
166     i = sscanf(chpt, "%d%d", &k, &m);
167
168     if (i != 2 || k < 0 || m < 0 || last + k >= LINEMAX)
169     {
170         printf("format error.\n");
171         return;
172     }
173
174     /* 写k行正文 */
175     printf("Please input %d line words:\n", k);
176
177     /* 先将原文的第m+1行开始都向后移k行 */
178     for (i = last-1; i > m-1; i--)
179     {
180         Line[i+k] = Line[i];/* 向后移k行 */
181     }
182
183     /* 再将中间的k行补上 */
184     for (i = 0; i < k; i++)
185     {
186         fgets(buffer, CHMAX, stdin);
187         Line[m+i] = (char *)malloc(strlen(buffer) + 1);
188         strcpy(Line[m+i], buffer);
189     }
190
191     last += k;    /* 给原来的last增加k行 */
192     modified = 1;    /* 已修改 */
193 }
194
195 void Delete()
196 {
197     int    i, j, m, n;    /* 删去原始正文的第m行到第n行内容 */
198
199     if (modified != 1)
200     {
201         printf("Did not open a filen\n");
202         return;
203     }
204
205     i = sscanf(chpt, "%d%d", &m, &n);
206     if (i != 2 || m < 0 || n < 0 || m >n || n > last)
207     {
208         printf("format error\n");
209         return;
210     }
211
212     /* 先删去,再移位 */
213     for (i = 0; i < (n-m+1); i++)
214         free(Line[m+i-1]);
215     for(i = n, j = 0; i < last; i++, j++)
216         Line[m+j-1] = Line[i];
217     last -= (n-m+1);
218
219     modified = 1;
220 }
221
222 void Quit()
223 {
224     int    i;
225     char    flag;
226     FILE    *fp_temp;
227
228     printf("Save? y/n:");
229     scanf(" %c", &flag);
230
231     if (flag == 'Y' || flag == 'y')
232     {
233         if ((fp_temp = fopen(filename, "w")) == NULL)
234         {
235             printf("Cannot open a file");
236             exit(1);
237         }
238         for (i = 0; i < last; i++)
239             fputs(Line[i], fp_temp);
240         printf("save successfully!\n");
241     }
242     else
243     ;
244     exit(0);
245
246 }

View Code

下面给出运行结果:

ps:最好都是每一行都会有回车键,因为fgets函数是指定字符数的。具体看代码就应该知道了。

有兴趣的同学可以改进!

转载于:https://www.cnblogs.com/fusae-blog/p/4269652.html

一个简单的文本编译器相关推荐

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

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

  2. C++ 容器的综合应用的一个简单实例——文本查询程序

    [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...

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

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

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

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

  5. 一个简单的文本聚类实现(python)

    具体实现如下,使用python+结巴分词+scikit-learn实现一个简单的文本聚类得到会议室数据,直接从DBA线上数据库得到预约数据,如下所示,共有3列,分别是会议ID,会议标题和会议时间 因为 ...

  6. 【Qt5开发及实例】16、实现一个简单的文本编辑器(over)

    实现一个简单的文本编辑器 其他具体的代码基础看前面:http://blog.csdn.net/cutter_point/article/details/42839071 1.功能 这个程序又添加了文本 ...

  7. 用vb思设计Java编译器_一个简单的VB-VC编译器 - 程序设计(Programming)版 - 北大未名BBS...

    发信人: phoenix (凤凰), 信区: VisualBasic 标  题: 一个简单的VB-VC编译器 发信站: PKU BBS (Thu Jan  6 14:05:52 2000), 转信 V ...

  8. Java实现一个简单的文本编辑器(简易版)

    (用Java做了一个简单的文本编辑器,其中看了很多博主的教学和代码,在这里感谢:@Mark7758.@Kingsly_Liang.@佐敦不下雨.再次感谢!) 1.功能说明: 文件菜单:打开.保存.新建 ...

  9. C/C++ 实现一个简单的文本编辑器(windows程序设计)

    一.实现目的 为了更好的学习QT中的窗口.句柄等概念,先对Windows编程进行了大体了解,通过一个简单文本编辑器的实现,来加深对这些基本概念的理解. 二. 基本功能 支持拷贝粘贴 支持文件保存(保存 ...

  10. qt编译实现简单的文本编译器有粘贴复制_qmake 时复制文件(自动在编译前做一些操作,且写在.pro文件里)...

    SQL语句判断数据库.表.字段是否存在 from master..sysdatabases where name='TestDB')    print 'TestDB存在'else    print  ...

最新文章

  1. numpy.copy详解
  2. 作用域和作用域链 —javascript面向对象高级
  3. [BZOJ3994][SDOI2015]约数个数和
  4. python多列排序
  5. linux下查询汇编指令手册,Linux命令大全
  6. 270 扩展固态硬盘_希捷硬盘白送3年原厂数据恢复!成功率高达90
  7. Android 资源(Resources)访问
  8. 学习阶段小测,简单的幸运抽奖系统
  9. 97年大学计算机考试是 级,1997年9月全国计算机等级考试一级笔试试卷 DOS
  10. 华硕的电脑装linux系统安装教程,华硕笔记本电脑一键重装系统详细教程
  11. DR、BDR、SBR、ASBR等名词的解释和原理
  12. 远程开机:一个简单的嵌入式项目开发
  13. Linux命令之实时监控系统进程状态top
  14. 使用POI对excel文件进行读取
  15. SystemSoftware
  16. 程序股票交易接口怎么使用?
  17. Parsing error: No Babel config file detected for
  18. 男子1分钟16位数开14次方 曾被诊断中度智障
  19. 简易的python计时器
  20. Excel 常用公式 - COUNTIF

热门文章

  1. linux切换英文界面,linux英文界面下使用中文输入法
  2. PHPMailer 报错:SMTP ERROR: Password command failed: 535 Login Fail
  3. 学校计算机的使用作文,电脑课上作文(3篇)
  4. 给apk去签名、重新签名
  5. java.lang.UnsatisfiedLinkError: Library not loaded: @rpath/libo.dylib Reason: image not found
  6. 一句“哭什么哭”,说得好
  7. 解决办法:Centos 7 SSH连接超时自动断开
  8. 开发人员测试,也必须有测试报告
  9. 灵异事件很多,却没有平行宇宙
  10. 龙芯指令集也可以开源