📄 trirow.h
字号:
#include "TriRow0.h"
Status Newfile(char s[]) /*新建文本*/
{
strcpy(Output,s);
if((fp=fopen(Output,"w+"))==NULL)
{
puts("can't open file\n");
return ERROR;
}
fclose(fp);
Openfile(Output); /*打开文本,默认在新建文件下编写*/
return OK;
}
Status Openfile(char outname[]) /*打开文本*/
{
strcpy(Output,outname);
if((fp=fopen(Output,"r+"))==NULL)
{
printf("can't open outfile\n");
return ERROR;
}
CreatLineFile();
Reading();
return OK;
}
Status CreatLineFile() //构造一个StrNode型的一维数组
{
int i;
A.elem=(StrNode)malloc(ActiveMULen*sizeof(SNode));
if(!A.elem) return ERROR; //存储分配失败
A.curlines=0; //空表长度为0
A.maxline=ActiveMULen; //初始存储容量
A.lag=0; //标志文件是否被修改
for(i=0;i<ActiveMULen;i++) //给一维数组部分元素赋初值
{
A.elem[i].num=0;
A.elem[i].flat=0;
}
return OK;
}
Status Reading() //将文件fp读到数据空间中
{
StrNode Newbase;
int i,u,j;
A.curlines=0; j=0;
while(!feof(fp)&&(j<=A.curlines))
{
page++; //页数加一
if(A.curlines>=A.maxline) //当前存储空间已满,增加分配
{
Newbase=(StrNode)malloc((A.maxline+ActiveMULenAdd)*sizeof(SNode));
if(!Newbase) return ERROR; //存储分配失败
A.elem=Newbase; //新基址
A.maxline+=ActiveMULenAdd; //增加存储量
for(u=ActiveMULen;u<A.maxline;u++) //给一维数组部分元素赋初值
{
A.elem[u].num=0;
A.elem[u].flat=0;
}
}
for(i=0;(i<20)&&(!feof(fp));i++,j++) //读每一页
{
fgets(A.elem[j].Sstring,MAXSTRLEN,fp); //将文件中的每行数据存到数组中
A.elem[j].num=strlen(A.elem[j].Sstring); //记录串的长度
A.elem[j].flat=1; //给标志变量赋值
A.curlines++; //长度加1
}//for
}// while
return OK;
}
Status Viewing(int c) //显示文本:显示当前数据空间内第c页,每页20行,c接受用户决定显示的第几页,c=1,2,……
{
int i,m,n;
m=(c-1)*20; n=c*20; //m为显示文本的初始行,n-1为末行数
printf("\t\t第%d页\n",c);
for(i=m;((i<n)&&(i<A.curlines-1));i++) //将第c页文本显示到文本显示区,并标出行号
{
if(i<10)
printf("000%d ",i);
else
if(i<100)
printf("00%d ",i);
else
if(i<1000)
printf("%0d ",i);
else
printf("%d ",i);
if(strcmp(Output,Open)==0) /*若文件是用户指定打开的,文件内部已经存有换行符,显示时不用再输出换行符*/
printf("%s",A.elem[i].Sstring);
else
{
printf("%s",A.elem[i].Sstring);
printf("\n");
}
}
return OK;
}
Status Finding(char s[],int i) //用户输入预查找内容,对文件进行查找,找到后输出它在该行中第一次出现位置;否则提示没有找到
{
int j,k,x; //位置j从一开始
StrNode T;
T=(StrNode)malloc(sizeof(SNode)); //申请StrNode T空间,将s拷到T中
strcpy(T->Sstring,s);
T->num=strlen(T->Sstring); //记录串的长度
T->flat=1;
if(i==-1) //查找整个文本
{
j=0; x=0; //x记录共查找到几处
for(k=0;k<A.curlines;k++) //查找活区的每一行
{
j=Index(&A.elem[k],T,1);
if(j!=0)
{
printf("查找到一个!它在第%d行,第%d个位置\n",k,j);
x++;
}
}
printf("整个文本共查找到%d个!\n",x);
return OK;
}
/*对某一行查找*/
j=Index(&A.elem[i],T,1); //模式匹配
if(j!=0)
printf("查找到!它在第%d行,第%d个位置\n",i,j);
if(j==0)
printf("没有查找到!\n");
return OK;
}
int Index(StrNode S,StrNode T,int pos)
{//返回子串T在主串S中第pos个字符之后的位置.若不存在,则函数值为0
int i=pos; int j=1;
while((i<=S->num)&&(j<=T->num))
{
if(S->Sstring[i-1]==T->Sstring[j-1])
{
i++; j++;
} //继续比较后续字符
else
{
i=i-j+2; //指针后退重新开始匹配
j=1;
}
}
if(j>T->num) return (i-T->num); //匹配成功
else return 0;
}
Status Replace(char s3[],char s4[],int i)
{ //根据用户输入的预替换内容,对活区内容进行替换,替换方式采用模式匹配查找,查找到后替换相应内容
char S1[MAXSTRLEN],S2[MAXSTRLEN],x;
StrNode T,S;
int l,j,q,k;
T=(StrNode)malloc(sizeof(SNode)); //申请StrNode T空间,将预替换内容s3拷到T中
strcpy(T->Sstring,s3);
T->num=strlen(T->Sstring); //记录串的长度
T->flat=1;
S=(StrNode)malloc(sizeof(SNode)); //申请StrNode S空间,将替换内容s4拷到S中
strcpy(S->Sstring,s4);
S->num=strlen(S->Sstring); //记录串的长度
S->flat=1;
if(i==-1) //替换整个文本
{
j=0;
for(l=0;l<A.curlines;l++) //查找活区的每一行l,替换相应内容
{
j=Index(&A.elem[l],T,1);
if(j!=0) //查找到内容进行替换
{
/*S1,S2保存i行除去串T后剩下的两个串*/
for(k=0;((k<j-1)&&(k<A.elem[i].num));k++)
S1[k]=A.elem[l].Sstring[k];
S1[k]='\0';
for(k=j+T->num-1,q=0;((k<A.elem[i].num)&&(q<A.elem[i].num));k++,q++)
S2[q]=A.elem[l].Sstring[k];
S2[q]='\0';
strcat(S1,S->Sstring); //将串是S1和S连接起来
strcat(S1,S2); //将串是S和S2接起来
strcpy(A.elem[l].Sstring,S1); //将连接好的串复制到数组元素中,实现替换
A.elem[l].num=strlen(A.elem[l].Sstring); //修改原信息值
A.lag=1; //标志文件被修改
x1++;
}
}
printf("整个文本共替换%d个!\n",x1);
return OK;
}
else
{
j=Index(&A.elem[i],T,1); //模式匹配
if(j!=0) //查找到内容进行替换
{
x1++;
}
/*S1,S2保存i行除去串T后剩下的两个串*/
for(k=0;((k<j-1)&&(k<A.elem[i].num));k++)
S1[k]=A.elem[i].Sstring[k];
S1[k]='\0';
for(k=j+T->num-1,q=0;((k<A.elem[i].num)&&(q<A.elem[i].num));k++,q++)
S2[q]=A.elem[i].Sstring[k];
S2[q]='\0';
strcat(S1,S->Sstring); //将串是S1和S连接起来
strcat(S1,S2); //将串是S和S2接起来
strcpy(A.elem[i].Sstring,S1); //将连接好的串复制到数组元素中,实现替换
A.elem[i].num=strlen(A.elem[i].Sstring);//修改原信息值
A.lag=1; //标志文件被修改
printf("是否替换文件其他处?Y/N\n");
x=getch(); //接受用户的命令
if(x=='y'||x=='Y')
Replace(T->Sstring,S->Sstring,-1);
}
return OK;
}
void Insert(char s[],int i)
{//根据用户输入的预插入内容和要插入第几行前,在活区中相应位置i前插入一行该内容,插入后总行数加一,i=0,1,……99
StrNode e;
e=(StrNode)malloc(sizeof(SNode)); //申请StrNode e空间,将预插入内容s拷到e中,
strcpy(e->Sstring,s);
e->num=strlen(e->Sstring); //记录串的长度
e->flat=1;
LineFileInsert(i,e); // 插入
A.lag=1;
}
Status LineFileInsert(int i,StrNode e) //在第i个位置之前插入新的数据元素e
{
int j;
StrNode p,q,Newbase;
if(i<0||i>=A.curlines) return ERROR; //i值不合格
if(A.curlines>=A.maxline) //当前存储空间已满,增加分配
{
Newbase=(StrNode)malloc((A.maxline+ActiveMULenAdd)*sizeof(SNode));
if(!Newbase) return ERROR; //存储分配失败
A.elem=Newbase; //新基址
A.maxline+=ActiveMULenAdd; //增加存储量
for(j=ActiveMULen;j<A.maxline;j++) //给一维数组部分元素赋初值
{
A.elem[j].num=0;
A.elem[j].flat=0;
}
}
q=&(A.elem[i]); //插入位置
for(p=&(A.elem[A.curlines-1]);p>=q;p--)
{
strcpy((p+1)->Sstring,p->Sstring); //将p值赋给p+1,插入位置之后的元素下移
(p+1)->num=p->num;
(p+1)->flat=p->flat;
}
strcpy(q->Sstring,e->Sstring); //插入e
q->num=e->num;
q->flat=e->flat;
if(strcmp(Output,Open)==0) /*若文件是用户指定打开的,插入时由于没有将换行符插入且保存时也不强行加入,所以插入时就强行加入换行符*/
{
q->Sstring[q->num]='\n';
q->Sstring[q->num+1]='\0';
}
A.curlines++; //插入后总行数加一
A.lag=1; //标志文件被修改
return OK;
}
Status Delete(int i, int j)
{ //删除:根据用户输入的相应位置i,j,在活区中删除从第i行到第j行的全部内容,删除后总行数减少j-i+1行。
i=i+1; j=j+1; //第0行是数组的第一个元素
if((i<1)||(j<1)||(i>A.curlines)||(j>A.curlines))
return ERROR; //i,j值不合格
for(;j<A.curlines;i++,j++)
{
strcpy(A.elem[i-1].Sstring,A.elem[j].Sstring); //将j+1个位置之后的数据前移j-i个位置
A.elem[i-1].num=A.elem[j].num;
A.elem[i-1].flat=A.elem[j].flat;
}
A.curlines=A.curlines-(j-i+1); //表长减j-i+1
A.lag=1; //标志文件被修改
for(i=i-1;i<A.maxline;i++)
{
A.elem[i].num=0;
A.elem[i].flat=0;
}
return OK;
}
Status Save() //将修改后的文件全部保存到文件中
{
int i,j=0;
char ch; k=0;
if(A.lag==0)
{
printf("文件已经保存!\n");
return OK;
}
else
{
if(strcmp(Output,"Node.txt")==0) /*如果在默认空文件下编写,请用户输入文件名*/
{
printf("文件命名为?\n");
while((ch=getchar())!='\n') /*提取用户输入的文件名*/
{
Output[k]=ch;
k++;
}
Output[k]='\0';
}
fclose(fp);
if((fp=fopen(Output,"w+"))==NULL)
{
printf("can't open outfile\n");
return ERROR;
}
if(strcmp(Output,Open)==0) /*若文件是用户指定打开的,文件内部已经存有换行符,不用再赋换行符*/
{
for(i=0;i<A.curlines-1;i++) /*将活区内容全部存到写入文件中*/
fputs(A.elem[i].Sstring,fp);
}
else
{
for(i=0;i<A.curlines-1;i++) //将活区内容全部存到写入文件中
{
fputs(A.elem[i].Sstring,fp);
fputc('\n',fp);
}
}
printf("保存完毕!文本被保存在%s中\n",Output);
A.lag=0; //标记已经文件已经保存过
return OK;
}
}
int cmding() //对用户输入的命令处理
{
char ch;
printf("\ncmd:"); /*提示用户输入命令串*/
k=0; w=0;
while((ch=getchar())!='\n') /*保存用户输入的命令串*/
{
if(ch==' ')
w++; /*空格数*/
m[k]=ch;
k++;
}
m[k]='\0';
if(w==0) /*空格数为0*/
{
if((strcmp(m,"Save")==0)||(strcmp(m,"save")==0))
return 1; /*保存文本*/
else if((strcmp(m,"Exit")==0)||(strcmp(m,"exit")==0))
return 2; /*活区切换*/
else if((strcmp(m,"Help")==0)||(strcmp(m,"help")==0))
return 10; /*帮助*/
else
return -1;
}
if(w==1) /*空格数为1*/
{
sscanf(m,"%s %d",a,&z);
if((strcmp(a,"View")==0)||(strcmp(a,"view")==0)) /*文本显示*/
return 3;
else
return -1;
}
if(w==2) /*空格数为2*/
{
sscanf(m,"%s %s %d",a,b,&z); /*字符串中格式化输入*/
if((strcmp(a,"New")==0)||(strcmp(a,"new")==0)) /*新建文本*/
return 4;
else if((strcmp(a,"Find")==0)||(strcmp(a,"find")==0)) /*查找*/
return 5;
else if((strcmp(a,"Insert")==0)||(strcmp(a,"insert")==0)) /*插入*/
return 6;
else if((strcmp(a,"Delete")==0)||(strcmp(a,"delete")==0)) /*删除*/
{
sscanf(m,"%s %d %d",a,&z,&v); /*字符串中重新格式化输入*/
return 7;
}
else if((strcmp(a,"Open")==0)||(strcmp(a,"open")==0)) /*打开文本*/
return 8;
else
return -1;
}
if(w==3) /*空格数为3*/
{
sscanf(m,"%s %s %s %d",a,b,c,&z);
if((strcmp(a,"Replace")==0)||(strcmp(a,"replace")==0)) /*替换*/
return 9;
else
return -1;
}
return 0;
}
void Help()//帮助函数,显示一些命令的格式
{
printf("\n\t******************************帮助**********************************\n");
printf("\t** 新建文本: New 文件名 **\n");
printf("\t** (注:输完文件名后请加一空格) **\n");
printf("\t** 打开文本: Open 文件名 **\n");
printf("\t** (注:输完文件名后请加一空格) **\n");
printf("\t** 文本显示: View 页数p **\n");
printf("\t** (注:p =0,1,2,…… ) **\n");
printf("\t** 查找: Find 预查找内容 行号i **\n");
printf("\t** (注:i=0,1,……-1;当i为-1,查找整个文本文件) **\n");
printf("\t** 替换: Replace 预替换内容 替换内容 行号i **\n");
printf("\t** (注:i=0,1,……-1;当i为-1,替换范围为整个文本文件) **\n");
printf("\t** 插入: Insert 插入内容 行号i **\n");
printf("\t** (注:i为本页的行号,i=0,1,……) **\n");
printf("\t** 删除: Delete 行号i 行号j **\n");
printf("\t** (注:i,j=0,1,……) **\n");
printf("\t** 保存文本: Save **\n");
printf("\t** 退出: Exit **\n");
printf("\t********************************************************************\n");
printf("\t** 注意:插入的每行元素个数不能大于500!行号从0开始! **\n");
printf("\t********************************************************************\n");
printf("\n\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -