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

📄 文本编辑.cpp

📁 课程设计: 关于二叉树操作
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.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(page chart[],line table[],int &tablelength)
   //   将文本数组里的内容映象为行表,带回行数
{   
    int i,j,k;
    i=j=k=0;
  
 for(i=0; text!='\0';i++)
  {   table[j].address=&text;
      k=1;
     while(text!='\n'&&text!='\0')
  { k++; i++; }
  table[j].length=k;
  if(text=='\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,"w+"))==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=key;
    i++;                }
   temp.address='\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);
     for(i=0;i<100;i++)
   table=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.length;j++)
        fprintf(fp,"%c",table.address[j]);
        fclose(fp); 
    }
    
 if(chart[newpage-1].flag==0)
  for(i=0;i<20;i++) name=in;
 else 
  for(i=0;i<20;i++) name=out;
  
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++;                      }
  text='\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=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.address;
     printf("%d  ",i+1);
        for(k=0;k<table.length;k++)
  { letterpointer=linepointer+k*sizeof(char);
            printf("%c",*letterpointer);
  }
   }  
   }
  return true;
}
void menu(){
 cout<<"*****************************************"<<endl<<endl<<endl;
 cout<<"        你好欢迎观看文本编辑程序"<<endl;
 cout<<"             设计者:曾荣飞"<<endl;
 cout<<"              20023032"<<endl;
 cout<<"*****************************************"<<endl;
 cout<<"          按任意键继续!"<<endl;
 getchar();
}

main()
{ page  pagechart[10];
  line  linetable[101];
  int  linelength;
  int  pages;
  char  key;
  int  choose;
  int  current;
  int  row;
  int  derow;
  menu();
  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(pagechart,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(pagechart,linetable,linelength);
     break;
 case 'q':  exit(0);  }
  }while(1);
  return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -