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

📄 全屏幕编辑软件的编写.txt

📁 这里是C语言与数据结构的课程设计与实验的程序,以及一些程序的原代码.
💻 TXT
📖 第 1 页 / 共 5 页
字号:
}

int compare()        /* 如扩展名为 EXE 等可忽略的文件名,返回 0,否则返回 1 */
{
  if(strstr(pt[0].ff_name,".EXE") || strstr(pt[0].ff_name,".COM")
           || strstr(pt[0].ff_name,".OV") || strstr(pt[0].ff_name,".OBJ")
           || strstr(pt[0].ff_name,".LIB") || strstr(pt[0].ff_name,".BAK")
           || strstr(pt[0].ff_name,".FOX") || strstr(pt[0].ff_name,".DBF")
           || strstr(pt[0].ff_name,".IDX"))
    return 0;
  return 1;
}

disp_dir(int a)                      /* 显示目录,a 为页号 */
{
  int i=16,j=1,k;                    /* i 为行坐标,j 为列坐标 */
  for(k=0;k<80;k++)
    write_char(14,k,'_',TEXT_COLOR); /* 在屏幕第 14 行画一横线,区分目录区 */
  clss(15,HH);                       /* 清目录显示区 */
  k=(a-1)*PG;                        /* 根据页号确定数组显示的起始项 */
  while(k<a*PG)  {                   /* 为显示一页建的循环 */
    write_string(i,j,ss[k++],0x0E);  /* 显示一个文件名 */
    j+=13;                           /* 右移 13 列 */
    if(j>67)  {                      /* 如列号大于 67 */
      ++i;                           /* 下移一行 */
      j=1;                           /* 列号置 1 */
    }
  }
}

f_name()                             /* 建临时文件和后备文件名 */
{
  int i;
  bfile=malloc(16);                  /* 为后备文件名字符串分配内存空间 */
  file1=malloc(16);                  /* 为临时文件名字符串分配内存空间 */
  file2=malloc(16);                  /* 为临时文件名字符串分配内存空间 */
  for(i=0;*(mfile+i)!='.' && *(mfile+i);i++)  *(bfile+i)=*(mfile+i);
                                     /* 截取文件名“.”前的部分,放入 bfile */
  *(bfile+i)=0;                      /* bfile 字符串以 '\0' 结尾 */
  strcpy(file1,bfile);               /* bfile 中字符串拷入 file1 */
  strcpy(file2,bfile);               /* bfile 中字符串拷入 file2 */
  strcat(bfile,".BAK");              /* bfile 加后缀.BAK */
  strcat(file1,".$1$");              /* 临时文件 1 加后缀.$1$ */
  strcat(file2,".$2$");              /* 临时文件 2 加后缀.$2$ */
  fp1=fopen(file1,"wb+");            /* 打开临时文件 1 */
  fp2=fopen(file2,"wb+");            /* 打开临时文件 2 */
}

bk()                                 /* 退出运行,至 DOS 下 */
{
  fcloseall();                       /* 关闭所有打开的文件 */
  remove(file1);                     /* 删除临时文件 1 */
  remove(file2);                     /* 删除临时文件 2 */
  clss(0,HH);                        /* 清屏 */
  goto_xy(0,0);                      /* 光标置屏幕左上角 */
  exit(0);                           /* 退出运行 */
}

write_prompt(char a)            /* 在屏幕提示区显示提示,a 为提示项数组下标 */
{
  char *prom[]=  {                         /* 存放提示的数组 */
    "请稍候.....",
    "请先定义块!",
    "块太大!",
    "行宽超过250!",
    "必须输入数字!",
    "只允许输入 Y 或 N!",
    "文件未找到!",
    "排版超宽!",
    "未设定排版宽度!"
  };
  int g;
  g=80-strlen(prom[a]);                    /* 显示起始列 */
  if(a)  putchar(7);                       /* 除第一项提示外,其余各项响铃警告 */
  write_string(HH,g,prom[a],PROM_COLOR);   /* 在提示区显示提示 */
}

write_ques(char a)           /* 在屏幕提问区显示提问,a 为提问项数组下标 */
{
  char *ques[]=  {                         /* 存放提问的数组 */
    "是否放弃并退出编辑?(Y/N)    ",
    "请输入字块存盘的文件名:                  ",
    "已有同名文件,是否复盖?(Y/N)    ",
    "请输入要插入的文件名:                  ",
    "请输入排版行宽:       ",
    "请输入要找的字符串:                                ",
    "请输入要移到的行号:         ",
    "寻找:                     换成:                      换否?  ",
    "请输入每页打印的行数:      ",
    "打印机未准备好,请准备好打印机,按任一键继续。",
    "请调好打印纸,按任一键开始打印。",
    "正在打印.....",
    "请输入页号打印列号:       ",
    "请输入起始页号:       "
  };
  clear_ques();                            /* 清提问区 */
  write_string(HH,0,ques[a],PROM_COLOR);   /* 在提问区显示提问 */
}

clear_prompt()                             /* 清提示区 */
{
  write_space(HH,60,20,TEXT_COLOR);        /* 用空格复盖提示区 */
}

clear_ques()                               /* 清提问区 */
{
  write_space(HH,0,60,TEXT_COLOR);         /* 用空格复盖提问区 */
}

int read_from(int a,int b,FILE *f)  /* 从文件 f 读入 b 行放入数组的第 a 行起 */
{
  int i,j;
  write_prompt(0);                         /* 提示“请稍候...” */
  for(i=a;i<a+b;i++) {                     /* 为逐行读出设的循环 */
    if(fgets(ss[i],HC,f)==NULL) {          /* 从 f 读出一行,如已超出文末 */
      j=0;                                 /* j 置初值 */
      while(ss[i-1][j]) {                  /* 检查文末行各字节 */
        if(ss[i-1][j]==0x1A) {             /* 文件结束符用 '\0' 替代 */
          ss[i-1][j]=0;
          break;
        }
        j++;                               /* 下移一字节 */
      }
      break;                               /* 跳出 for 循环 */
    }
  }
  clear_prompt();                          /* 清提示区 */
  return i-a;                              /* 返回读出行数 */
}

write_to(int a,int b,FILE *f)        /* 把编辑数组第 a 行起的 b 行写入文件 f */
{
  int i;
  write_prompt(0);                         /* 提示“请稍候...” */
  for(i=a;i<a+b;i++) fputs(ss[i],f);       /* 逐行将字符串写入文件 f */
  clear_prompt();                          /* 清提示区 */
}

coord()                                    /* 显示标尺行 */
{
  int i,j,k,g;
  g=m*BP;                                  /* 本屏行首列号 */
  y=yy-g;                                  /* 计算 y */
  k=(enq-g>ZS+1)?ZS+1:enq-g;               /* 排版宽度处列坐标 */
  for(i=1;i<=ZS+1;i++)  {                  /* 自左至右显示标尺 */
    j=(i<=k)?0x04:0x01;                    /* 排版行宽度内用红色,否则用蓝色 */
    ((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
                                           /* 逢 5 显示“|”,其余显示“-” */
  }
  g=(y<k) ? 0x50 : 0x30;                   /* 确定标尺光标色彩 */
  ((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
                                           /* 显示标尺光标 */
}

xh()                                   /* 在信息行显示当前行序、列、行数值 */
{
  char sl[8],sh[8],sz[8];
  itoa(yy+1,sl,10);                        /* 变列号数值为字符串 */
  ltoa(xx+1,sh,10);                        /* 变行号数值为字符串 */
  ltoa(ser+1,sz,10);                       /* 变字序号数值为字符串 */
  write_string(H1,8,"序:         行:        列:    ",0x05);
  write_string(H1,12,sz,0x07);             /* 显示字序号 */
  write_string(H1,24,sh,0x07);             /* 显示行号 */
  write_string(H1,35,sl,0x07);             /* 显示列号 */
}

int string_lingth()                        /* 计算除回车换行符外的当前行长 */
{
  int g;
  g=strlen(ss[ss_x]);                      /* 测当前行字符串总长 */
  if(ss[ss_x][g-1]==0x0A) g-=2;            /* 去除回车换行符的长度 */
  return g;                                /* 返回计算值 */
}

Enter()                                    /* 输入回车 */
{
  int g,k;
  chg=1;                                   /* 文件已修改标志置为真 */
  if(!ins) {                               /* 如为非插入状态 */
    g=string_lingth();                     /* 计算当前行长(不包括回车换行符) */
    strcpy(ss[ss_x]+g,da);                 /* 字符串以硬回车换行符结尾 */
    if(xx==ttl_x)   {                      /* 如是文末行,下移一行 */
      fp_rd++;                             /* fp 已读出行最大行号加 1 */
      ttl_x++;                             /* 文末行行号加 1 */
      ss_max++;                            /* 编辑数组实用最大行号加 1 */
    }
    if(m==0 && g<ZS)  write_char(x,FH,'<',CHAR_COLOR);
                                           /* 如行尾在 0 屏,显示硬回车标志 */
    ss_x++;   xx++;                        /* 数组行号和文本行号均加 1 */
    ser+=g-yy+2;                           /* 计算字序数 */
    if(ss_x>ss_max)  tj();                 /* 如下行超出编辑数组最大行号,
                                              从 fp2 或 fp 读入一部分 */
    if(x<H3)  {                            /* 如不是屏幕底行 */
      if(m)  {                             /* 如不是 0 屏 */
        m=0;
        disp_t();                          /* 显示 0 屏各行 */
      }
      x++;                                 /* 屏幕光标下移一行 */
    }
    else  {                                /* 如是屏幕最下行 */
      if(!m) {                             /* 如原在 0 屏,则滚屏 */
        roll_scr_up(0,H3);                 /* 向上滚屏 */
        disp(ss_x,x);                      /* 当前坐标补显一行 */
      }
      else  {                              /* 如原不在 0 屏 */
        m=0;                               /* 显示 0 屏 */
        disp_t();
      }
    }
  }
  else  {                                  /* 如为插入状态 */
    g=m;                                   /* 保存原屏号 */
    k=x;                                   /* 保存原屏幕行坐标 */
    intercept(yy);                         /* 从当前光标处折断字符串 */
    strcpy(ss[ss_x-1]+yy,da);              /* 折断处加硬回车换行符 */
    if(!g) {                               /* 如原在 0 屏 */
      if(k<H3)  roll_scr_down(x,H3);       /* 不在屏底行,本行起下滚 */
      else   roll_scr_up(0,H3);            /* 在屏底行,全屏上滚 */
      disp(ss_x-1,x-1);                    /* 重显原行(上一行) */
      disp(ss_x,x);                        /* 显示当前行 */
    }
    else  disp_t();                        /* 如原不在 0 屏,重显一屏 */
  }
  yy=0;                                    /* 光标至行首 */  
}

Del()                                      /* 退格键、删字键处理 */
{
  int i,k;
  k=x;                                     /* 保存原行坐标 */
  chg=1;                                   /* 文件已修改标志置为真 */
  switch(delc()) {                         /* 删字,根据返回值判断 */
    case 0:                                /* 如返回 0 */
      disp(ss_x,x);                        /* 重显当前行 */
      break;                               /* 跳出开关语句 */
    case 1:                                /* 如返回 1 */
      disp_t();                            /* 重显一屏 */
      break;                               /* 跳出开关语句 */
    case 2:                                /* 如返回 2 */
      if(x>0)  --x;                        /* 如不在屏幕最上行,光标上移一行 */
      comput();                            /* 计算参数 */
      if(m) disp_t();                      /* 如不在 0 屏,重显一屏 */
      else  {                              /* 如在 0 屏 */
        if(k) {                            /* 如原不在屏顶行 */
          roll_scr_up(k,H3);               /* 自当前行起滚屏 */
          i=H3-x;                          /* 屏幕最下行与当前行间行数 */
          if(xx+i<=ttl_x)                  /* 如最下行还有,显示此行 */ 
            disp(ss_x+i,H3);
        }

⌨️ 快捷键说明

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