校园快讯|学习资讯|CCC留言|校园文学|电脑网络|创业沙龙|博客日志|求职招聘|二手市场|学子相册

时尚女生|旅游指南|动漫天地|校园问答|失物招领|时尚生活|校园交友|笑话频道|分类广告|留言反馈

 
信息资讯 你问我答 找工作 找人才 二手市场
您的位置:思源驿站 > 电脑网络 > C语言 > 浏览正文
C语言文本文件行编辑程序说明及源程序
www.syyz.com  发布:2009-5-18 11:58:18  来自:转载  浏览:
  文本文件行编辑程序说明及源程序

功能模块:
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;
}



 
              
(编辑:孤舟钓徒) 留言评论】【在线投稿】【打印网页】【关闭窗口】【↑顶部
+ 相关文章
·c#求一年中的第几天
·c语言学习
·微软架构师谈编程语言发展(一)
·想知道学习编程从何入手吗?
·C语言音乐演奏程序说明及源程序
·C语言小球弹跳游戏程序运算实训说明
·C语言汉字显示程序说明及源程序
·C语言进制转换程序说明及源程序
·C语言多项式运算程序说明及源程序
·C语言猜数字游戏!可查看游戏排名!
版权与免责声明:
1.凡本网注明来源为“盐城师范学院思源驿站”的所有作品,包括文字与图片,未经本网授权不得转载。违反上述声明者,本网将依法追究法律责任。
2. 凡注明"来源:xxx(非本站)"的作品,均转载自其它媒体,本网转载的目的在于传播更多信息,此类稿件并不代表本网观点,本网不承担此类稿件侵权行为的直接责任及连带责任。
3. 如因作品内容、版权等需要同本网联系的,请在作品在本网发表之日起30日内联系,否则视为放弃相关权利