📄 wenbenbianji.c
字号:
#include<stdio.h>
#include<stdlib.h>
// 文本编辑器 每行80字,每页20行,每个活区5页
typedef struct{
char *address; //每行在文本数组中的起始地址
int length; //行的长度
}line; //行表的元素项
typedef struct{
int number; //每活区相对文件头的起始字符号
int flag; //该活区是否被改动,将决定活区表对应的文件
int howmany; //该活区有多少字符
}page; //活区的元素项
char text[8000];
char in[20];
char out[20];
// 全局变量
bool initlinetable(char in[],page chart[],int &pages)
// 读入文本文件,产生活区表
// 带回活区数变量
{ FILE *fp;
int i,j,k;
i=j=k=0;
char temp;
int f;
if((fp=fopen(in,"r"))==NULL)
{
printf(" 不能打开输入文件 \n");
exit(0); }
chart[0].number=0;
chart[0].flag=0;
k++;
while(!feof(fp))
{ fscanf(fp,"%c",&temp);
i++;
if(temp=='\n') { j++; f=0;}
else f=1;
if(f==0&&j%100==0)
{ chart[k].number=i; chart[k].flag=0; k++; }
}
fclose(fp);
pages=k;
for(k=0;k<pages-1;k++)
chart[k].howmany=chart[k+1].number-chart[k].number;
chart[k].howmany=i-chart[k].number;
printf("文件读入完成\n");
return true; }
bool linetableset(line table[],int &tablelength)
// 将文本数组里的内容映象为行表,带回行数
{
int i,j,k;
i=j=k=0;
for(i=0; text[i]!='\0';i++)
{ table[j].address=&text[i];
k=1;
while(text[i]!='\n'&&text[i]!='\0')
{ k++; i++; }
table[j].length=k;
if(text[i]=='\0') break;
j++;
}
tablelength=j;
printf("行表设置完成\n");
return true;
}
bool insertline(char out[],line table[],page chart[],int serial,int whichrow,int &tablelength)
// 在当前活区内插入行,将活区表对应的映象的改动标志位置1
// 对活区内行表进行插入操作
// 当活区满时,再插入后产生活区下移, 最上一行写入文件
// 活区号和行号为范围值
{ FILE *fp;
int i, j;
i=j=0;
line temp;
char key;
if((fp=fopen(out,"r"))==NULL)
{
printf(" 不能打开输出文件 \n");
exit(0); }
while(!feof(fp))
{ fscanf(fp,"%c",&key); i++;}
fclose(fp);
chart[serial-1].number=i-1;
chart[serial-1].flag=1;
for(j=tablelength-1; j>=whichrow; j--)
{ table[j+1] =table[j] ;
}
temp.address=(char *)malloc(80*sizeof(char));
i=0;
while(key!='\n')
{ key=getchar();
temp.address[i]=key;
i++; }
temp.address[i]='\n';
temp.length=i;
table[whichrow]=temp;
tablelength++;
chart[serial-1].howmany=chart[serial-1].howmany+i;
if(tablelength>100)
{ if((fp=fopen(out,"a+"))==NULL)
{ printf("活区溢出,文件追加错误"); exit(0); }
for(i=0;i<table[0].length;i++)
fprintf(fp,"%c",table[0].address[i]);
for(i=0;i<100;i++)
table[i]=table[i+1];
tablelength--;
printf("活区满,活区整体下移一行\n");
fclose(fp);
}
printf("行插入完成\n");
return true;
}
bool activepagevary(page chart[],int &tablelength,line table[], int oldpage, int newpage)
// 活区的初始化及切换,将原活区按行表写入数组,将新活区按活区表掉入文本数组
{ FILE *fp;
int i,j;
char temp;
char name[20];
if(oldpage!=0)
if(chart[oldpage-1].flag==1)
{ fp=fopen(out,"a+");
for(i=0;i<tablelength;i++)
for(j=0;j<table[i].length;j++)
fprintf(fp,"%c",table[i].address[j]);
fclose(fp);
}
if(chart[newpage-1].flag==0)
for(i=0;i<20;i++) name[i]=in[i];
else
for(i=0;i<20;i++) name[i]=out[i];
if((fp=fopen(name,"r"))==NULL)
{ printf(" 不能打开文件 \n"); exit(0); }
for(i=0;i<chart[newpage-1].number-1;i++)
fscanf(fp,"%c",&temp);
//fseek(fp,chart[newpage-1].number*sizeof(char),0);
i=0;
while(i<chart[newpage-1].howmany)
{ fscanf(fp,"%c",&text[i]);
i++; }
text[i]='\0';
fclose(fp);
printf("活区设置完成\n");
return true;}
bool linedelete(line table[],int &tablelength,int whichrow)
// 在行表上删除一行
{ int j;
for(j=whichrow-1;j<tablelength;j++)
table[j]=table[j+1];
tablelength--;
printf("行删除完成\n");
return true;}
bool displayline(line table[],int length)
{
int pag[5];
int i,j,k;
i=j=k=0;
int key;
char *letterpointer;
char *linepointer;
for(i=0;i<5;i++)
pag[i]=20*i;
while(key!=0)
{ printf("该活区共%d页,请选择页号",length/20);
scanf("%d",&key);
for(i=pag[key-1]; i<pag[key]&&i<length; i++)
{ linepointer=table[i].address;
printf("%d ",i+1);
for(k=0;k<table[i].length;k++)
{ letterpointer=linepointer+k*sizeof(char);
printf("%c",*letterpointer);
}
}
}
return true;
}
main()
{ page pagechart[10];
line linetable[101];
int linelength;
int pages;
char key;
int choose;
int current;
int row;
int derow;
choose=0;
printf("输入文件名:");
scanf("%s",in);
printf("输出文件名");
scanf("%s",out);
initlinetable(in,pagechart,pages);
printf("共有%d个活区",pages);
printf("请选择活区");
while(choose<1||choose>pages)
scanf("%d",&choose);
activepagevary(pagechart,linelength,linetable,0,choose);
current=choose;
linetableset(linetable,linelength);
do{
printf("输入命令: i---行插入, d---行删除, c---活区切换 p---活区显示, q---退出程序\n");
printf("您的选择是:");key=getchar();
switch(key) {
case 'i': printf("共%d行,想插入到第几行下",linelength);
row=-1;
while(row<0||row>linelength) scanf("%d",&row);
insertline(out,linetable,pagechart,current,row,linelength) ;
break;
case 'd': printf("共%d行,想删除第几行",linelength);
derow=0;
while(derow<1||derow>linelength) scanf("%d",&derow);
linedelete(linetable,linelength,derow) ;
break;
case 'p': displayline(linetable,linelength) ;
break;
case 'c': printf("共有%d个活区",pages);
printf("请选择活区");
choose=0;
while(choose<1||choose>pages)
scanf("%d",&choose);
activepagevary(pagechart,linelength,linetable,current,choose);
current=choose;
linetableset(linetable,linelength);
break;
case 'q': exit(0); }
}while(1);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -