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

📄 wenbenbianji.c

📁 一个很简单的用C写的文本编辑的工具,在tc下运行调试成功 希望对大家有用!
💻 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 + -