⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trirow.h

📁 这是数据结构的课程设计,关于一个简单的行编辑程序.文本编辑程序是利用计算机进行文字加工的基本软件工具
💻 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 + -