文本文件行编辑程序说明及源程序
功能模块: 1、打开与显示(void edit()) 2、插入行(void insert()) 3、删除行(void delete()) 4、退出程序(quit()) (其中涉及int save()保存模块) 操作说明: 1、以屏幕菜单显示操作方式; 2、以命令方式实现文本文件的打开与显示、若干行插入、若干行删除与退出; e+filename:Edit (open and display) i+k+m:Insert (insert k lines follow the row of m ) d+m+n :Delete (delete the line from m to n ) q :Quit (leave the system) 功能流程:
显示命令菜单 | | ————————————— | | | | 显示 插入 删除 退出 (命令选择:--) 改进之处: 1、缺少修改行功能,如何实现? 2、如何实现分屏显示功能? 学生阅读程序后,自己理解程序并改进程序。
源程序: #include <stdio.h> #define MAXLEN 100 #define MAXLINE 100 char Buffer[MAXLEN],filename[128]; char *LinePointer[MAXLINE]; /*定义字符指针数组来存储要编辑的文本行指针*/ int Modified=0; /*正文被修改标志*/ int LineNum; /*当前正文行数*/ char *CmdPointer; /*输入命令行字符指针*/ void Quit() { int i; char c; if(Modified==1) /* 如正文被修改,则提示用户是否要保存*/ { printf("Save or not? (y/n):"); scanf("%c",&c); if(c=='y'||c=='Y') /* 保存被修改过的正文 */ Save(); } for(i=0;i<LineNum;i++) /* 释放内存 */ free(LinePointer[i]); } void Insert() { int k,m,i; sscanf(CmdPointer,"%d%d",&k,&m); /* 读入参数 */ for(i=LineNum;i>m;i--) /* 后继行向后移 */ LinePointer[i+k-1]=LinePointer[i-1]; for(i=0;i<k;i++) /* 读入k行正文,并插入到指针数组,待写入文件*/ { fgets(Buffer,MAXLEN,stdin); LinePointer[m+i]=(char *)malloc(strlen(Buffer)+1); strcpy(LinePointer[m+i],Buffer); } LineNum+=k; /* 修正正文行数及设置正文被修改标志*/ Modified=1; } void Delete() { int i,j,m,n; sscanf(CmdPointer,"%d%d",&m,&n); /* 读入参数 */ if(n>LineNum) n=LineNum; for(i=m;i<=n;i++) /* 删除正文 */ free(LinePointer[i-1]); for(i=m,j=n+1;j<=LineNum;i++,j++) LinePointer[i-1]=LinePointer[j-1]; LineNum=i-1; /* 修正正文行数及设置正文被修改标志*/ Modified=1; } int Save() /* 保存文件 */ { int i; FILE *fp; if((fp=fopen(filename,"w"))==NULL) { printf("Can't open the %s.\n",filename); return 0; } for(i=0;i<LineNum;i++) { fputs(LinePointer[i],fp); free(LinePointer[i]); } fclose(fp); return 1; } void Edit() /* 编辑命令函数*/ { int i; FILE *fp; /*读入文件名*/ sscanf(CmdPointer,"%s",filename); /* 以读的方式打开文件*/ if((fp=fopen(filename,"r"))==NULL) {/* 如不存在,则创建文件 */ fp=fopen(filename,"w"); fclose(fp); fp=fopen(filename,"r"); } i=0; while(fgets(Buffer,MAXLEN,fp)==Buffer) { LinePointer[i]=(char *)malloc(strlen(Buffer)+1); strcpy(LinePointer[i++],Buffer); } fclose(fp); LineNum=i; } int main() { int j,flag=0,flag2=0; LineNum=0; clrscr(); while(1) { printf("\n*************************************************************\n"); printf("| e+filename:Edit (open and display) |\n"); printf("| i+k+m:Insert (insert k lines follow the row of m ) |\n"); printf("| d+m+n :Delete (delete the line from m to n ) |\n"); printf("| q :Quit (leave the system) |\n"); printf("*************************************************************\n"); printf("Please input a command:\n"); gets(Buffer); /*读入命令行*/ for(CmdPointer=Buffer;(*CmdPointer==' ')||(*CmdPointer=='\t');CmdPointer++); /*掠过空白符*/ if(*CmdPointer=='\0') /*空行重新输入*/ continue; switch(*CmdPointer) { case 'e': /*调用编辑函数*/ CmdPointer++; /*掠过命令符,指向参数*/ Edit(); break; case 'i': /*调用插入函数*/ CmdPointer++; Insert(); break; case 'd': /*调用删除函数*/ CmdPointer++; Delete(); break; case 'q': /*调用退出函数*/ flag2=1; Quit(); break; default: /*非法命令符*/ flag=1; break; } if(flag==1) continue; printf("The text of the file %s is:\n",filename); /*显示正文*/ for(j=0;j<LineNum;j++) fputs(LinePointer[j],stdout); if(flag2==1) break; } return 0; }
|