




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
简单的行编辑器 【要求】 (1) 设置一个简单的行编辑器,每行以回车结束 (2) 数据以文件形式存储 (3) 编辑器具有查找、替换、修改数据的功能2011-7-9。请把所有的注释信息提取出来就可以写程序设计报告。#include /*标准文件流操作,这里使用了open/fclose/fprintf/printf/scanf/gets函数*/#include /*标准系统库,这里使用了malloc/free/exit*/#include /*标准字符串库,这里使用strlen/strcpy/memcpy/memset*/#define szLINE 252 /*定义一行字符串最长为252字节*/#define CMDS 12 /*定义12个标准行编辑命令*/*采用链表存储文本*/typedef struct LINE char textszLINE; /*文本内容*/struct LINE * next; /*链表指针*/L;/*简写无类型整数*/typedef unsigned int U; /*定义12个行编辑命令的标准格式*/typedef void (*FUNC)(L *, char*); /*定义12个标准行编辑命令的关键字*/char keywordsCMDS8= quit, help, load, save, view, count, append, insert, erase, edit, lookup, replace; /*end keywords*/*清空链表操作*/void clear(L * lines) L *a =0, *b=0; if(!lines) return ;a = *lines;while(a) b=a-next ;free(a);a=b; /*end while*/*lines=0; /*end clear*/*在链表中根据行号index调出指定的行*/L *locate(L *lines, U index) L *t=lines; U i = 0; if(!t) return 0; if(index = 0) return t; for(i=0; inext; if(!t) return 0;/*next*/return t;/*end locate*/*浏览命令,如果f存在则以带行号格式保存文件(如果f=stdout则打印到屏幕上),浏览范围为from到to(行号)。view(lines, 0, 0, 0)表示统计已加载到内存的文本行数量*/int view(L * lines, FILE * f, U from, U to)L *t=lines; U index=0;while(t) index +;if(f & index = from & index text);t=t-next; /*end while*/return index;/*end view*/*在当前文档中根据关键字进行搜索,并将搜索结果打印出来*/void lookup(L * lines, char * string)L *t=0; U index = 0;if(!string) return ;t=lines;while(t) index +;if(strstr(t-text , string) printf(%d: %s, index, t-text );t=t-next;/*end while*/*end lookup*/*在一行文本中执行替换命令,把所有关键字替换为新关键字*/void rpc(char * string, char * key, char * replacement) char fineszLINE, *x=0, *y=0, *z=0;int la=0, lb=0, r=0;if(!string | !key | !replacement) return ;memset(fine, 0, szLINE);x=string; y=fine; /*首先记录新旧关键字长度*/ la=strlen(key); lb=strlen(replacement); do /*用指针逐个比较*/ r = memcmp(x, key, la); if(r)/*如果关键字不匹配则复制字符串*/*y=*x;x+; y+;else/*如果关键字匹配则替换字符串*/memcpy(y, replacement, lb);x += la; y += lb;/*end if*/while(*x);/*将替换完成的结果返回*/memcpy(string, fine, szLINE);/*end rpc*/*全文替换*/void replace(L * lines, char * string, char * replacement)L *t=0;U index=0; if(!string | !lines | !replacement) return ;t=lines;while(t) index +;if(strstr(t-text , string) printf(BEFORE %d: %s, index, t-text );rpc(t-text, string, replacement);printf(AFTER %d: %s,index,t-text);/*end if*/t=t-next;/*end while*/*end replace*/*根据行号插入一行新文本,如果行号小于零则将文本追加至链表尾*/void insert(L * lines, char * line, int index)L *t=0, *s=0; int i=0; if(!lines | !line) return ; /*首先为新文本分配一个链表节点*/ t=(L*)malloc(sizeof(L); memset(t, 0, sizeof(L); strcpy(t-text , line); if(index = 0 | !*lines) /*如果链表为空则以新节点为起点定义链表*/ t-next=*lines; *lines=t; return ; /*end if*/ s=*lines; if(index 0)/*如果行号为正整数,则将链表指针指向行号之前*/ for(i=0;inext ) break; s = s-next ; /*next*/ else/*否则链表指针指向表尾*/ while(s-next ) s = s-next ; /*end if*/ /*完成链表插入操作*/ if(s-next ) t-next = s-next ; s-next = t;/*end insert*/*根据行号删除一行文本*/void erase(L * lines, U index)L *a=0, *b=0, *c=0; if(!lines) return ; /*index -1 表示目标行,index -2表示目标行的前一行*/ a=locate(*lines, index-2); b=locate(*lines, index-1); if(!b) return ; if(a) /*如果前一行存在则删除目标行*/ a-next=b-next; else/*否则表示表头删除*/ *lines = b-next ; /*end if 释放内存*/ free(b);/*end erase*/*根据行号和新录入文本替换原有行*/void edit(L * lines, char * line, U index) L * t=locate(lines,index-1); if(!t)return ; if(line) strcpy(t-text , line);/*end edit*/*将文件整个装入链表*/int load(L * lines, char * file)FILE * f=0; char lineszLINE=;int total = 0;if(!lines | !file) return 0;clear(lines);/*首先清空链表*/*打开文件*/f=fopen(file, r);if(!f) fprintf(stderr, %s is bad.n, file);return 0;/*end if*/*逐行读入内存并插入表尾*/while(!feof(f) memset(line, 0, szLINE);fgets(line, szLINE - 1, f);insert(lines, line, -1);total +;/*end while*/fclose(f);fprintf(stderr, %s %d lines loaded.n, file, total);/*返回总行数*/return total;/*end load*/*将链表保存到指定的文本文件*/int save(L * lines, char * file) FILE *f=0; L *t=lines; int total=0; if(!lines | !file) return 0; /*打开文件*/ f=fopen(file, w); if(!f) fprintf(stderr, %s is bad.n, file);return 0; /*end if*/ t=lines; while(t) /*逐个文件写入*/ fprintf(f,%s, t-text ); t=t-next ; total +; /*end while*/ fclose(f); fprintf(stderr, %s %d lines saved.n, file, total); /*返回总行数*/ return total;/*save*/*执行加载文本文件命令*/void exec_load(L * lines, char * line) char cmdszLINE = , fileszLINE = ; /*分析命令行,提取文件名*/ sscanf(line, %s %s, cmd, file); /*执行加载命令*/ load(lines, file);/*end exec_load*/*执行文本保存命令*/void exec_save(L * lines, char * line) char cmdszLINE = , fileszLINE = ; /*分析命令行,提取文件名*/ sscanf(line, %s %s, cmd, file); /*执行保存命令*/ save(*lines, file);/*end exec_save*/*执行文本查看命令*/void exec_view(L * lines, char * line) char cmdszLINE = ; U from = 0, to = 0; /*分析命令行,提取目标要查看的起始行号和终止行号*/ sscanf(line, %s %u %u, cmd, &from, &to); /*如果起始行号和终止行号大小相反,则根据起始行号显示一页*/ if(to 1) a=strcmp(argv1, -help); b=strcmp(argv1, /h); if(a & b) load(&lines,argv1); else exec_help(0, 0); return 0; /*end if*/ /*end if*/ /*主命令循环*/ for(;) /*命令提示符中间是表示当前载入的文档总共有多少行的意思*/ printf(n, view(lines, 0,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧物流技术与实务 教案全套 潘艳君 项目1-6 智慧物流概述-智慧物流的综合应用
- 2025年环保产业园区产业集聚与协同发展中的环保产业绿色技术创新报告
- 2025年工业互联网平台数据清洗算法在智能教育领域的应用对比报告
- 金融与投资行业洞察报告:2025年金融科技在金融衍生品交易中的应用与创新
- 美妆行业个性化定制服务模式在美妆行业市场拓展中的应用报告
- 2025年工业互联网平台RFID技术在智能工厂生产安全风险控制中的应用报告
- 做微商的心得体会经典十四篇
- 无人机传感器技术 8.1.陀螺仪在航空领域及无人机飞控中的应用
- 无人看守设备管理制度
- ktv安全风险管理制度
- 内审不符合项案例
- 在高中语文教学中如何融入中华民族共同体意识
- 柔性温度-压力传感器的设计与制备
- 2025年版中医(壮医)专业医师资格考试大纲
- 2025年安徽芜湖宜居投资集团招聘笔试参考题库含答案解析
- 2025年中国南方航空招聘笔试参考题库含答案解析
- 2024版北美留学咨询与申请一体化服务合同3篇
- 建设项目全过程工程咨询-第二次形成性考核-国开(SC)-参考资料
- 头面部烧伤的护理
- 广联达GTJ建模进阶技能培训
- 云南省保山市(2024年-2025年小学五年级语文)人教版期中考试((上下)学期)试卷及答案
评论
0/150
提交评论