全屏幕编辑软件的编写(C语言)03

wahaosao803057

wahaosao803057

2016-02-19 13:18

下面是个超简单的全屏幕编辑软件的编写(C语言)03教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

write_block(long v)                /* 将 ddd 中内容拷至当前行指定位置 */
{                                  /* 参数 v 为拷贝后块尾行号 */
  int i,g;
  char *b;
  b=malloc(HC);                    /* 为 b 分配内存空间 */
  strcpy(b,ss[ss_x]+yy);           /* 将当前行光标后字符串暂放入 b 中 */
  if(ss_max-ss_xQ3+H3) wfp2();    /* 如编辑数组当前行后较多,存一些到 fp2 */
  for(;;)  {                       /* 建一个无限循环 */
    write_prompt(0);               /* 提示请稍候... */
    if((g=v-xx)QB-1-ss_max) {     /* 如块移入后编辑数组不会溢出 */
      mov(ss_x+1,g);               /* 将目标行后的编辑数组后移 */
      ss_max+=g;                   /* 编辑数组已用最大行号增加 */
      fp_rd+=g;                    /* fp 已读出最大行号增加 */
      ttl_x+=g;                    /* 文末行行号增加 */
      while(*ddd)  {               /* *ddd 为真则循环 */
        ss[ss_x][yy]=*ddd++;       /* ddd 中字符读入当前行 yy 处 */
        ser++;                     /* 字序数加 1 */
        if(ss[ss_x][yy++]==0x0A) { /* 如读到一换行符后 */
          ss[ss_x][yy]=0;          /* 串尾加 '' 定界 */
          ss_x++;   xx++;          /* 下移一行 */
          yy=0;                    /* 至行首列 */
        }
      }
      strcpy(ss[ss_x]+yy,b);       /* b 中字串接到行尾 */
      break;                       /* 跳出 for 循环 */
    }
    else  {                        /* 如编辑数组装不下 */
      if(ss_xQ1)  wfp1();         /* 如当前行在后半数组,写一部分到 fp1 */
      else {                       /* 如当前行在前半数组 */
        mov(ss_x+1,(g=QB-1-ss_max));    /* 将当前行后的编辑数组后移 */
        ss_max=QB-1;               /* 定数组已用最大行行号 */
        for(i=0;ig;i++) {         /* ddd 中字块读入编辑数组共 g 行 */
          while(*ddd)  {           /* *ddd 为真则循环 */
            ss[ss_x][yy]=*ddd++;   /* ddd 中内容读入数组行当前列 */
            ser++;                 /* 字序号加 1 */
            if(ss[ss_x][yy++]==0x0A)  {  /*  如遇到换行符 */
              ss[ss_x][yy]=0;      /* 以''结束本行 */
              ss_x++;    xx++;     /* 行号增 1 */
              yy=0;                /* 至行首列 */
              fp_rd++;             /* fp 已读出最大行号增 1 */
              ttl_x++;             /* 文末行行号加 1 */
              break;               /* 填完一行,跳出 while 循环 */
            }
          }
        }
      }
    }
  }
  free(b);                         /* 释放内存 */
  clear_prompt();                  /* 清提示区 */
}

 

del_block()                        /* 删除块 */
{
  int j;
  write_prompt(0);                 /* 提示请稍候... */
  /* 以下计算删除原块后,原光标位置的变化 */
  if(!(txxksx||(txx==ksx && tyy=ksy))) {
    if(txxkwx)  txx-=kwx-ksx;
    else {
      if(txx==kwx && tyykwy)  tyy-=kwy-ksy;
      else  tyy=ksy;
      txx=ksx;
    }
  }
  Ctrl_F(0);                       /* 移到块首,不显示 */
  if(ksx==kwx)   strcpy(ss[ss_x]+yy,ss[ss_x]+kwy);
                         /* 如块首块尾在同一行,将块尾后的字符串拷至块首起 */
  else  {                          /* 如块首块尾不在同一行 */
    Ctrl_T(0);                     /* 块首行删至行末,不显示 */
    ser+=2;                        /* 计算字序数 */
    xx++;    ss_x++;               /* 至下行 */
    y=0;   yy=0;                   /* 至行首 */
    while(xxkwx)  Ctrl_Y(0);      /* 逐行删除,不显示 */
    yy=kwy;                        /* 当前行已移至块尾行,列号定为块尾列号 */
    ser+=yy;                       /* 计算块尾列的字序号 */
    Ctrl_E(0);                     /* 删至行首,不显示 */
    delc();                        /* 本行剩余部分接至块前 */
  }
  ser+=tyy-yy;                     /* 计算字序数 */
  if((j=ss_x+H3-x)ss_max && jttl_x)  tj();
                  /* 屏幕文本区底行超出数组,且未到文末,从 fp 或 fp2 读入 */
  mvto(txx);                       /* 重返原坐标 */
  clear_prompt();                  /* 清提示区 */
}

int read_block()                   /* 字块读入缓冲区 ddd */
{
  int i,j;
  write_prompt(0);                 /* 提示请稍候... */
  txx=xx;                          /* 保存原文本行号 */
  tyy=yy;                          /* 保存原文本列号 */
  Ctrl_F(0);                       /* 移到块首,不显示 */
  if(ksx==kwx) {                   /* 如块首块尾在同一行 */
    j=kwy-ksy;                     /* 计算块串长 */
    ddd=malloc(j+2);               /* 给 ddd 分配内存空间 */
    dd=ddd;                        /* 保存 ddd 指针首址 */
    for(i=0;ij;i++)  *ddd++=ss[ss_x][ksy+i];    /* 块读入 ddd */
    *ddd++=0;                      /* ddd 以 '' 结尾 */
    vv=i;                          /* 统计块长字节数 */
    yy+=i;                         /* 移至块尾 */
  }
  else  {                          /* 如块首块尾不在同一行 */
    ddd=malloc(KK);                /* 给 ddd 分配内存空间 */
    dd=ddd;                        /* 保存 ddd 首指针 */
    first=strlen(ss[ss_x])-ksy;    /* 计算块首行中块串长 */
    vv=first;                      /* 计算读入字节数 */
    for(i=0;ifirst;i++)  *ddd++=ss[ss_x][ksy+i];  /* 首行中块串读入 ddd */
    xx++;    ss_x++;               /* 至下行 */
    yy=0;                          /* 至行首 */
    for(;;)  {                     /* 为读入字块建的循环 */
      tj();                        /* 如当前行在数组后半部,写 Q3 行到 fp1,
                                   数组行数不足数组一半,从 fp1 或 fp2 补充之 */
      if(kwx-xx=ss_max-ss_x) {    /* 如块尾在当前编辑数组中 */
        while(xxkwx)              /* 当前行在块尾行前则循环 */
          if(hb())  return 1;      /* 读入 ddd 中,如块太大返回 1 */
        break;                     /* 退出 for 循环 */
      }
      else                         /* 如块尾不在编辑数组中 */
        while(ss_xss_max)         /* 数组中的字块部分读入ddd */
          if(hb())  return 1;      /* 计算字节数,读入 ddd,如块太大返回 1 */
    }
    for(i=0;ikwy;i++)  *ddd++=ss[ss_x][i];  /* 读入块末行的块串 */
    vv+=i;                         /* 计算读入的字节数 */
    yy=kwy;                        /* 到块尾 */
    *ddd=0;                        /* ddd 以 '' 结尾 */
  }
  ser+=vv;                         /* 计算字序数 */
  ddd=dd;                          /* 返回指针头 */
  clear_prompt();                  /* 清提示区 */
  return 0;                        /* 正常读完,返回 0 */
}

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

int hb()                           /* 计算块的字节数,读入 ddd 中 */
{
  int i=0;
  vv+=strlen(ss[ss_x]);            /* 计算读入的字节数 */
  if(vv=KK-255)   {               /* 如字节数超出 ddd 最大空间 */
    mvto(txx);                     /* 重返原坐标 */
    comp_disp();                   /* 重显原屏幕 */
    write_prompt(2);               /* 提示块太大! */
    clear_ques();                  /* 清提问区 */
    ddd=dd;                        /* 返回首指针 */
    free(ddd);                     /* 释放 ddd 占用内存空间 */
    return 1;                      /* 返回 1 */
  }
  while(ss[ss_x][i])  *ddd++=ss[ss_x][i++];  /* 读一行至 ddd */
  ss_x++;    xx++;                 /* 至下一行 */
  return 0;                        /* 返回 0 */
}

int over(int g)                    /* 行超长处理,g 为当前行长度 */
{
  if((kwx==ksx && vv+gHC-4)||
       (kwx!=ksx &&(tyy+firstHC-4 || g-tyy+kwyHC-4))) {
    mvto(txx);                     /* 重返原坐标 */
    comp_disp();                   /* 重显原屏幕 */
    ddd=dd;                        /* 返回指针头 */
    free(ddd);                     /* 释放 ddd 占用的内存空间 */
    write_prompt(3);               /* 提示:行超长 */
    return 1;                      /* 发生超长返回 1 */
  }
  return 0;                        /* 未发生行超长返回 0 */
}

Ctrl_W()                           /* 字块存盘 */
{
  long g;
  if(blck==2)  {                   /* 如已定义块 */
    g=ser;                         /* 保存字序号 */
    write_ques(1);                 /* 提问存盘文件名 */
    if(key_string(HH,25,hsz,PROM_COLOR)=0) {  /* 如为空串或按 ESC */
      clear_ques();                /* 清提问区 */
      return;                      /* 退出本功能 */
    }
    if(findfirst(hsz,pt,0)==0){    /* 如当前目录中已有此文件 */
      write_ques(2);               /* 提问是否复盖 */
      if(key_yn(30)1)  {          /* 输入 Y 或 N,如按 ESC 键或输入 N */
        clear_ques();              /* 清提问区 */
        return;                    /* 退出本功能 */
      }
    }
    fp3=fopen(hsz,"wb+");          /* 以写方式打开文件 hsz,文件指针放入 fp3 */
    if(read_block()) {             /* 读块到 ddd ,如失败,跳出开关语句 */
      ser=g;                       /* 恢复原参数 */
      return;                      /* 退出本功能 */
    }
    write_prompt(0);               /* 提示请稍候... */
    fwrite(ddd,sizeof(char),vv,fp3);     /* ddd 中内容写入文件 fp3 */
    fputc(0x1A,fp3);               /* 加文件结束符 */
    fclose(fp3);                   /* 关闭文件 fp3 */
    free(ddd);                     /* 释放 ddd 占用的内存 */
    mvto(txx);                     /* 重返原坐标 */
    ser=g;                         /* 恢复原参数 */
    comp_disp();                   /* 重显屏幕 */
    clear_prompt();                /* 清提示区 */
    clear_ques();                  /* 清提问区 */
  }
  else write_prompt(1);            /* 提示:请先定义块 */
}

Ctrl_R()                           /* 外部文件读入光标处 */
{
  int i,j,g,v;
  write_ques(3);                   /* 提问外部文件名 */
  if(key_string(HH,23,hsz,PROM_COLOR)=0) { /* 输入字符串,如为空串或按 ESC */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  if((fp3=fopen(hsz,"rb"))==NULL){ /* 如文件不存在 */
    clear_ques();                  /* 清提问区 */
    write_prompt(6);               /* 提示文件未找到 */
    return;                        /* 退出本功能 */
  }
  chg=1;                           /* 文件已修改标志置为真 */
  txx=xx;                          /* 保存文本行号 */
  tyy=yy;                          /* 保存文本列号 */
  *hsz=0;                          /* 字符串置为空串 */
  g=0;                             /* 累计读入行数置初值 0 */
  for(;;)  {                       /* 分批读入的循环 */
    ddd=malloc(KK+1);              /* 给 ddd 分配内存 */
    dd=ddd;                        /* 保存 ddd 首指针 */
    j=fread(ddd,sizeof(char),KK,fp3);       /* 读文件KK字节至ddd */
    v=0;                           /* 本次读入行数置初值 0 */
    while(*ddd) {                  /* *ddd 为真则循环 */
      if(*ddd==0x1A)  {            /* 以 '' 代替文件结束符 */
        *ddd=0;
        break;                     /* 退出循环 */
      }
      if(*ddd++==0x0A) {           /* 计算读入行数 */
        ++v;                       /* 本次循环读入行数加 1 */
        ++g;                       /* 累计读入行数加 1 */
      }
    }
    ddd=dd;                        /* 恢复指针到指针头 */
    v+=xx;                         /* 计算本次拷入后光标行号 */
    write_block(v);                /* ddd 中内容拷入当前位置 */
    ddd=dd;                        /* 恢复 ddd 指针到指针头 */
    free(ddd);
    if(jKK)  break;               /* 读入字节数小于 KK 时,文件已读完 */
  }
  if(txxksx) ksx+=g;       /* 如当前行在块首行前,块首行号增加读入文件行数 */
  else {                           /* 如当前行不在块首行前 */
    if(txx==ksx && tyy=ksy) {     /* 如当前行为块首行,当前列在块首列前 */
      ksx+=g;                      /* 块首行行号增加 g */
      ksy+=yy-tyy;                 /* 计算块首列列号 */
    }
  }
  if(txxkwx) kwx+=g;              /* 如当前行在块尾行后,块尾行行号增加 g */
  else {                           /* 如当前行不在块尾行后 */
    if(txx==kwx && tyy=kwy) {     /* 如当前行在块尾行,并在块尾列前 */
      kwx+=g;                      /* 块尾行行号加 g */
      kwy+=yy-tyy;                 /* 计算块尾列列号 */
    }
  }
  comp_disp();                     /* 计算显示参数,重显当前屏幕 */
  fclose(fp3);                     /* 关闭外部文件 */
  clear_ques();                    /* 清提问区 */
}

Ctrl_P()                           /* 当前编辑文本的打印 */
{
  FILE *fpw,*fpr;
  unsigned char prt[255];
  int i,j,k,a,b=0,pg;
  write_ques(8);                   /* 提问每页打印行数 */
  if((j=key_digit(22))=0) {       /* 输入行数,如为空串或按 ESC 键 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  write_ques(12);                  /* 提问页号位置 */
  if((k=key_digit(20))=0) {       /* 输入起始列号,如为空串或按 ESC 键 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  write_ques(13);                  /* 提问起始页号 */
  if((pg=key_digit(16))=0) {      /* 输入起始页号,如为空串或按 ESC 键 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  Shift_F1();                      /* 存盘不退出 */
  if((fpr=fopen(mfile,"rb"))==NULL) { /* 打开主文件,指针赋于 fpr,如失败返回 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  fpw=fopen("PRN","w");            /* 打开设备文件(打印机),指针赋于 fpw */
  while(1) {                       /* 为分页打印设的循环 */
    write_ques(10);                /* 提示:调整好打印机,按一键开始打印 */
    if(gett()==-1||tpt()==-1) {    /* 测打印机,如按 Esc 键 */
      fclose(fpr);                 /* 关闭 fpr */
      clear_ques();                /* 清提问区 */
      return;                      /* 返回 */
    }
    for(i=0;ij;i++) {             /* 为一页内分行打印设的循环 */
      if(fgets(prt,255,fpr)==NULL) {    /* 从 fpr 读入一行至 prt, 如失败 */
         while(i++j) {            /* 未打满一页则循环 */
           fprintf(fpw,"n");      /* 打印一空行 */
           b=1;                    /* 文件结束标志置 1 */
         }
         break;                    /* 跳出 for 循环 */
      }
      for(a=0;prt[a];a++) {        /* 去除字符串中的回车换行符 */
        if(prt[a]==0x0D || prt[a]==0x8D)   break;
      }
      prt[a]=0;                    /* 字符串以 '' 定界 */
      fprintf(fpw,"%sn",prt);     /* 打印一行 */     
    }
    fprintf(fpw,"n");             /* 走纸一行 */
    for(a=0;ak;a++) fprintf(fpw," ");    /* 打印页号前空格 */
    fprintf(fpw,"%dn",pg++);  /* 打印页号 */
    if(b) break;                   /* 如打印完全文,退出循环 */
  }
  clear_ques();                    /* 清提问区 */
  fclose(fpr);                     /* 关闭打印的文本文件 */
  fclose(fpw);                     /* 关闭打印机文件 */
}

int tpt()                         /* 打印机状态测试 */
{
  while(1)  {                     /* 为重复测试建的循环 */
    if(inp(0x379)==0xDF)  break;  /* 取 0x379 端口值,如等于 0xDF, 跳出循环 */
    else  write_ques(9);          /* 否则提示打印机未准备好 */
    if(gett()==-1)   {            /* 等待按键,Esc 键返回 -1,否则继续循环 */
      clear_ques();               /* 清提问区 */
      return -1;                  /* 返回 -1 */
    }
  }
  write_ques(11);                 /* 提示正在打印.... */
  return 0;                       /* 返回 0 */
}

Esc()                             /* 放弃存盘,退出编辑 */
{
  if(chg) {                       /* 如文本已修改过 */
    write_ques(0);                /* 提问:是否放弃并退出编辑 */
    if(key_yn(26)1) {            /* 如输入 N */
      clear_ques();               /* 清提问区 */
      return;                     /* 返回,继续编辑 */
    }
  }
  bk();                           /* 退出程序,至 DOS 下 */
}

Chr()                             /* 输入字符 */
{
  static bb=0;                    /* 定义一个静态变量作为全角一、三区字符标志 */
  int j,g,k;
  if(cc.ch[0]==0xF0 && cc.ch[1]==76)  return;   /* 屏蔽小键盘中间键 */
  if(cc.ch[0]31) {               /* 屏蔽控制键 */
    chg=1;                        /* 文件已修改标志置为真 */
    qq=0;                         /* 全角制表符标志变量初始化 */
    make_tab();                   /* 如表线开关为开,产生表格线 */
AA: z2=cc.ch[0];                  /* 将字符放入 z2 */
    if(yy=enq)  {                /* 如在排版宽度以后 */
      if(vs(enq-1)==0) {          /* 如排版长度处不为全角后半部 */
        if(yy==enq) {             /* 如写在排版长度处 */
          if(z2160)  {           /* 如为半角字符 */
            if(punc1(z2))  goto BB;   /* 如为指定标点符号,转写入字符串 */
            else k=enq;           /* 如不是,在此处折断 */
          }
          else  {                 /* 如为全角字符 */
            if(z2==161 || z2==163)  {  /* 如第一字节在一、三区 */
              z1=z2;              /* 输入字符从 z2 移入 z1 暂存 */
              bb=1;               /* 全角一、三区标志置 1 */
              goto BB;            /* 先写入字符串 */
            }
            else k=enq;           /* 否则在此处折断 */
          }
        }
        else  {                   /* 如在排版长度之后 */
          if(bb && punc2(z1,z2))  goto BB;
                                  /* 如为指定全角标点符号,写入字符串 */
          else  {                 /* 否则检查排版长处字符 */
            bb=0;                 /* 全角一、三区标志 bb 恢复初值 */
            a1=ss[ss_x][enq];     /* 排版长处取一字节,放入 a1 */
            if(a1160)  {         /* 如为半角字符 */
              if(punc1(a1)) k=enq+1; /* 如为指定半角标点,折断处后移一字节 */
              else k=enq;         /* 否则原处折断 */
            }
            else  {               /* 如为全角字符 */
              a2=ss[ss_x][enq+1]; /* 再取一字节放入 a2 */
              if(punc2(a1,a2))    /* 如为指定全角标点*/
                k=enq+2;          /* 折断处后移二字节 */
              else   k=enq;       /* 否则原处折断 */
            }
          }
        }
      }
      else  {                     /* 排版长度处为全角字符后半部 */
        z1=ss[ss_x][enq-1];       /* 读出全角前半部 */
        if(yy==enq) {             /* 如写入处在排版长度处 */
          if(punc2(z1,z2))  goto BB;   /* 如为指定全角标点, 转写入字符串 */
          else  k=enq-1;          /* 否则折断处前移一字节 */
        }
        else  {                   /* 如写入在排版长之后 */
          a2=ss[ss_x][enq];       /* 检查应折断处字符 */
          if(punc2(z1,a2))        /* 如为指定全角标点 */
            k=enq+1;              /* 折断处后移一字符 */
          else  k=enq-1;          /* 否则,折断处前移一字节 */
        }
      }
      intercept(k);               /* 折断字符串换行 */
      strcpy(ss[ss_x-1]+k,ra);    /* 折断处加软回车符 0x8D0A */
      yy-=k;                      /* 计算列号 */
      comp_disp();                /* 计算参数,重显当前屏幕 */
    }
BB: g=string_lingth();            /* 计算行长(不包括回车换行符) */
    if(ins || yy==g)  {           /* 如为插入状态或写在行末 */
      if(gHC-4)  {               /* 如行超长退回 */
        write_prompt(3);          /* 提示:行超长 */
        return;                   /* 退出 */
      }
      if(xx==ksx && yyksy)  ksy++;  /* 计算块坐标变化 */
      if(xx==kwx && yykwy)  kwy++;
      for(j=g+3;jyy;j--)  ss[ss_x][j]=ss[ss_x][j-1];
    }                             /* 插入字符后的字符依次后移 */
    else {                        /* 如为非插入状态 */
      if(cc.ch[0]127 && ss[ss_x][yy]0xA0)  ss[ss_x][yy+1]=32;
                                  /* 如为半角复盖全角,全角后半字填空格 */
      if(vs(yy)==0 && cc.ch[0]0xA0 && ss[ss_x][yy]127
        && ss[ss_x][yy+1]0xA0){  /* 如为全角复盖一个半角和一个全角的前半部 */
        ss[ss_x][yy+2]=32;        /* 全角后半字节填空格 */
      }
    }

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

全屏幕编辑软件的编写(C语言)03

编程语言 网络编程
全屏幕编辑软件的编写(C语言)03

全屏幕编辑软件的编写(C语言)01

编程语言 网络编程
全屏幕编辑软件的编写(C语言)01

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

全屏幕编辑软件的编写(C语言)05

编程语言 网络编程
全屏幕编辑软件的编写(C语言)05

全屏幕编辑软件的编写(C语言)06

编程语言 网络编程
全屏幕编辑软件的编写(C语言)06

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

全屏幕编辑软件的编写(C语言)04

编程语言 网络编程
全屏幕编辑软件的编写(C语言)04

全屏幕编辑软件的编写(C语言)02

编程语言 网络编程
全屏幕编辑软件的编写(C语言)02

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

新手入门:简单学习JSP的基本语法

新手入门:简单学习JSP的基本语法

Win10正式版中任务栏点击没有反应假死该怎么办?

Win10正式版中任务栏点击没有反应假死该怎么办?
下拉加载更多内容 ↓