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

不朽尊座

不朽尊座

2016-02-19 13:18

下面这个全屏幕编辑软件的编写(C语言)05教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!

Shift_F1()                         /* 存盘,不退出编辑 */
{
  int i,j;
  if(chg) {                        /* 如果文件已修改过 */
    F1(0);                         /* 存盘 */
    old=1;                         /* 有老文件标志置 1 */
    fp=fopen(mfile,"rb");          /* 重新打开正文文件 */
    fseek(fp,vw,SEEK_SET);         /* fp 读写指针复原 */
  }
  clear_prompt();                  /* 清提示区 */
  chg=0;                           /* 文件已修改标志置 0 */
}

 

F2()                                  /* 移动当前行至指定行 */
{
  long i;
  write_ques(6);                      /* 提问要移到的行号 */
  if((i=key_digit(19))=0) {          /* 输入行号,如为空串或按 ESC 键 */
    clear_ques();                     /* 清提问区 */
    return;                           /* 退出本功能 */
  }
  i--;                                /* 输入行号转换为数组行号 */
  if(fp_end && ittl_x)  i=ttl_x;
                           /* 如 fp 已读完,目标行大于文末行号,移到文末行 */
  tyy=yy;                             /* 保存列号 */
  mvto(i);                            /* 移到目标行 */
  comp_disp();                        /* 重显一屏 */
  clear_ques();                       /* 清提问区 */
}

F3()                                  /* 输入排版行宽 */
{
  int i;
  write_ques(4);                      /* 提问排版行宽 */
  if((i=key_digit(16))=0) {          /* 在提问行输入行宽,如为空串或按 ESC 键 */
    clear_ques();                     /* 清提问区 */
    return;                           /* 退出本功能 */
  }
  enq=i;                              /* 行宽值赋给全局变量 enq */
  if(enqHC-4)  {                     /* 行宽值如超过允许字节数 */
    enq=HC-4;                         /* 取最大允许字节数为排版行宽 */
    itoa(enq,hsz,10);                 /* 变数值为字符串 */
    write_prompt(7);                  /* 提示:排版超宽 */
    write_space(HH,16,30,PROM_COLOR); /* 清输入区 */
    write_string(HH,16,hsz,PROM_COLOR);  /* 重显行宽 */
  }
}

F4()                                  /* 排版至段末 */
{
  if(enqHC-4) {                      /* 如已设置排版宽度 */
    chg=1;                            /* 文件已修改标志置为真 */
    reform();                         /* 排版至段末 */
    comp_disp();                      /* 计算参数并重显一页 */
  }
  else  write_prompt(8);              /* 否则,提示:未设置排版宽度 */
}

Shift_F4()                            /* 连续排版至文末 */
{
  if(enqHC-4) {                      /* 如已设置排版宽度 */
    chg=1;                            /* 文件已修改标志置为真 */
    while(reform());                  /* 从当前光标行排版至文末 */
    comp_disp();                      /* 计算参数并重显一页 */
  }
  else  write_prompt(8);              /* 否则,提示:未设置排版宽度 */
}

int reform()                          /* 从当前位置排版至本段末 */
{
  int k,g;
  write_prompt(0);                    /* 提示请稍候... */
  for(;;)  {                          /* 为段排版设置的循环 */
    g=string_lingth();                /* 计算字符串长(不包括回车换行符) */
    if(genq) {                       /* 如串尾在排版宽后 */
      if(vs(enq-1)==0)  {             /* 如排版宽度处不为全角字符前半字 */
        if(ss[ss_x][enq]0xA0) {      /* 如排版宽度后一字节为半角字符 */
          if(punc1(ss[ss_x][enq]))    /* 如为指定半角标点 */
            k=enq+1;                  /* 折断处后移 1 字节 */
          else k=enq;                 /* 否则原处折断 */
        }
        else  {                       /* 如排版宽度处字符为全角 */
          if(punc2(ss[ss_x][enq],ss[ss_x][enq+1]))   /* 如为指定全角标点 */
            k=enq+2;                  /* 折断处后移 2 字节 */
          else  k=enq;                /* 否则原处折断 */
        }
      }
      else  {                         /* 如排版宽度处为全角字符前半字 */
        if(punc2(ss[ss_x][enq-1],ss[ss_x][enq]))    /* 如为指定的全角标点 */
          k=enq+1;                    /* 折断处后移一字节 */
        else k=enq-1;                 /* 否则, 折断处前移一字节 */
      }
      ser+=k-yy;                      /* 计算字序数 */
      if(ss[ss_x][k]!=0x0D) {         /* 如折断处不在段末 */
        intercept(k);                 /* 在 k 处折断行 */
        strcpy(ss[ss_x-1]+k,ra);      /* 折断处加软回车 */
      }
      else {                          /* 如折断处已到串尾 */
        xx++;   ss_x++;               /* 到下一行 */
        ser+=2;                       /* 计算字序数 */
        yy=0;                         /* 到行首 */
        break;                        /* 退出循环 */
      }
      yy=0;                           /* 到行首 */
    }
    else  {                           /* 如串尾在排版宽前 */
      if(xxttl_x) {                  /* 如未到文末 */
        ser+=g-yy+2;                  /* 计算字序数 */
        ss_x++;   xx++;               /* 到下行 */
        yy=0;   y=0;                  /* 到行首 */
        if(ss_xss_max)  tj();        /* 如超出缓冲区数组,读入一部分 */
        if(ss[ss_x-1][g]==0x8D) {     /* 如上行末为软回车 */
          if(delc()==-1)   return 0;  /* 本行接至上行末,行超长返回 */
        }
        else  break;                  /* 否则退出 */
      }
      else {                          /* 如已到文末行 */
        clear_prompt();               /* 清提示区 */
        return 0;                     /* 返回 0 */
      }
    }
  }
  clear_prompt();                     /* 清提示区 */
  return 1;                           /* 返回 1 */
}

F5()                                 /* 搜索字符串 */
{
  write_ques(5);                     /* 提问要找的字符串 */
  *fnd=0;                            /* fnd 清为空串 */
  if(key_string(HH,19,fnd,PROM_COLOR)=0)  {
                                     /* 输入字符串,如为空串或按 ESC 键 */
    clear_ques();                    /* 清提问区 */
    return;                          /* 退出本功能 */
  }
  Shift_F5();                        /* 进行搜索 */
}

Shift_F5()                           /* 进行搜索 */
{
  if(*fnd)  {                        /* 如搜索字符串不为空串 */
    if(find(fnd)) *fnd=0;            /* 搜索,如到文末,字符串 fnd 清为空串 */
    comp_disp();                     /* 计算参数并重显一屏 */
  }
}

int find(char *a)                    /* 寻找字符串 */
{
  int i,j,b;
  j=strlen(a);                       /* 计算要找的字符串长 */
  while(xx=ttl_x)  {                /* 在总行数范围内找 */
    if(ss_x+H3-x=ss_max) tj();      /* 本屏最下行如超出缓冲区最大行,数组
                                       上部存 Q3 行到 fp1,下部读入 Q3 行 */
    b=string_lingth();               /* 计算本行除行末回车换行符外的字符数 */
    for(i=0;ij;i++)  {              /* 对比 j 个字符 */
      if(b-yy+1j)  {                /* 如本串剩下已不足要找的串长 */
        if(xxttl_x)  {              /* 如未到文末行 */
          ss_x++;    xx++;           /* 下移一行 */
          ser+=b-yy+2;               /* 计算字序数 */
          yy=0;                      /* 至行首 */
          break;                     /* 退出 for 循环 */
        }
        else  {                      /* 如到文末行 */
          ser+=b-yy;                 /* 计算字序数 */
          yy=b;                      /* 至行末列 */
          clear_ques();              /* 清提问区 */
          return  1;                 /* 返回 1 */
        }
      }
      if(ss[ss_x][yy+i]!=*(a+i)) {   /* 如有一个字符对不上 */
        yy++;   ser++;               /* 后移一字符 */
        i=-1;                    /* i 加步长进入循环后变为初值 1,重新对比 */
      }
      else if(i==j-1)  {             /* 如 j 个字符都对上 */
             if(!vs(yy+j-1)) {       /* 如找到的串尾不在前半个汉字 */
               yy+=j;                /* 当前位置移至对上的最后一字符后 */
               ser+=j;               /* 计算字序数 */
               return  0;            /* 返回 0 */
             }
             else {                  /* 否则后移一字节 */
               yy++;  ser++;
               i=-1;             /* i 加步长进入循环后变为初值 1,重新对比 */
             }
           }
    }
  }
}

F6()                                 /* 字符串替代 */
{
  int i,j,g,k;
  write_ques(7);                     /* 提问搜索和替代的字符串 */
  if(key_string(HH,6,hsz,PROM_COLOR)=0)  {
                                     /* 输入要找的字符串,如为空串或按 ESC 键 */
    clear_ques();                    /* 清提问区 */
    return;                          /* 退出本功能 */
  }
  ddd=malloc(HC);                    /* 给 ddd 分配内存 */
  dd=ddd;                            /* 保存 ddd 的首指针 */
  if(key_string(HH,32,ddd,PROM_COLOR)=0)  {
                                     /* 输入替代的字符串,如为空串或按 ESC 键 */
    free(ddd);                       /* 释放 ddd 占用的内存空间 */
    clear_ques();                    /* 清提问区 */
    return;                          /* 退出本功能 */
  }
  g=strlen(hsz);                     /* 计算搜索的字符串长 */
  k=strlen(ddd);                     /* 计算替代的字符串长 */
  while(1)  {                        /* 为连续找设的循环 */
    if(find(hsz)) {                  /* 如到文末 */
      comp_disp();                   /* 计算参数,显示一屏 */
      break;                         /* 退出本功能 */
    }
    xh();                            /* 在 H1 行重显当前行、列、序号 */
    comp_disp();                     /* 计算参数,显示一屏 */
    if((j=key_yn(59))==-1) {         /* 回答是否替换,如按 ESC */
      clear_ques();                  /* 清提问区 */
      break;                         /* 退出本功能 */
    }
    if(j) {                          /* 如按 Y,进行替换操作 */
      chg=1;                         /* 文件已修改标志置为真 */
      i=yy-g;                        /* 删除原字符串后光标处列号 */
      while(yyi)  delc();           /* 删除原字符串 */
      if(xx==ksx && yyksy) ksy+=k;  /* 计算字块坐标变化 */
      if(xx==kwx && yykwy) kwy+=k;
      write_block(xx);               /* ddd 中字符串拷入 */
      ddd=dd;                        /* ddd 返回指针头 */
    }
  }
  free(ddd);                         /* 释放 ddd 占用的内存空间 */
}

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

F7()                                 /* 定义块首行、列号 */
{
  ksx=xx;                            /* 块首标志行号等于当前光标行号 */
  ksy=yy;                            /* 块首标志列号等于当前光标列号 */
  if(blck==0) {                      /* 如尚未定义块 */
    blck=1;                          /* 块标志置 1 */
    kwx=ksx;                         /* 块尾标志同块首重合 */
    kwy=ksy;
    disp(ss_x,x);                    /* 重显当前行 */
    return;                          /* 返回 */
  }
  if(kwxksx||(kwx==ksx && kwy=ksy)) { /* 如当前光标在原块尾后 */
    kwx=ksx;                         /* 块尾行号移至块首行 */
    kwy=ksy;                         /* 块尾列号移至块首列 */
    blck=1;                          /* 块标志置 1 */
  }
  else blck=2;
  disp_t();                          /* 重显一屏 */
}

Shift_F7()                           /* 清除块定义 */
{
  blck=0;                            /* 块标志置 0 */
  ksx=kwx=-1;                        /* 块标行号置初值 */
  ksy=kwy=-1;                        /* 块标列号置初值 */
  comp_disp();                       /* 重显一屏 */
}

F8()                                 /* 定义块尾 */
{
  kwx=xx;                            /* 定块尾行号 */
  kwy=yy;                            /* 定块尾列号 */
  if(blck=1)  {                     /* 如块标志为 1 或 2 */
    if(kwxksx||(kwx==ksx && kwy=ksy)){    /* 如在块首前 */
      ksx=kwx;                       /* 块首行号同块尾 */
      ksy=kwy;                       /* 块首列号同块尾 */
      blck=1;                        /* 块标志置 1 */
    }
    else   blck=2;                   /* 否则,块标志置 2 */
    disp_t();                        /* 重显一屏 */
  }
  else  F7();                        /* 如未定义块,设块首 */
}

F9()                                 /* 移到文首 */
{
  upto(0x0L);                        /* 移至 0 行 */
  Home();                            /* 移至行首 */
  comp_disp();                       /* 计算显示参数,显示文首屏幕 */
}

Shift_F9()                           /* 移至文末 */
{
  if(xxttl_x)  dnto(ttl_x);         /* 如不在文末行,下翻到文末行 */
  End();                             /* 移至行末 */
  comp_disp();                       /* 计算参数,重显一屏 */
}

F10()                                /* 表格线状态转换开关 */
{
  if(tab) {                          /* 如 tab 为真 */
    tab=0;                           /* 转置 tab 为 0 */
    write_space(H1,4,4,TEXT_COLOR);  /* 盖掉屏幕信息行表线提示 */
  }
  else  {                            /* 如 tab 为假 */
    tab=1;                           /* 转置 tab 为 1 */
    write_string(H1,4,"表线",0x1E);  /* 在屏幕信息行显示表线二字 */
  }
}

upto(long a)                         /* 上移到 a 行 */
{
  ser-=yy;                           /* 计算当前行首字序数 */ 
  while(oa && a=xx-ss_x+x) {
                           /* fp1 中尚有记录,目标行小于数组 x 行,则循环 */
    while((ss_x-1)x) {              /* 数组当前行号大于屏幕行坐标,则循环 */
      --xx;     --ss_x;              /* 上移一行 */
      ser-=string_lingth()+2;        /* 计算字序数 */
    }
    st();                  /* 如编辑数组当前行号不足屏幕行坐标,从 fp1 读入 */
  }
  while((xx-1)=a) {                 /* 目标行在当前行前,则循环 */
    --xx;   --ss_x;                  /* 上移一行 */
    ser-=string_lingth()+2;          /* 计算字序数 */
  }
  orien();                           /* 确定列号 */
  ser+=yy;                           /* 计算字序数 */
}

dnto(long a)                         /* 下移到第 a 行 */
{
  int i;
  ser+=string_lingth()-yy+2;         /* 计算下行首字序数 */
  ss_x++;    xx++;                   /* 当前行下移一行 */
  while(a=xx-ss_x+(i=ss_max+x-H3) && (ob||!fp_end))  {
                /* 目标行超出,屏幕最下行超出数组,fp2 或 fp 中尚有记录则循环 */
    while(ss_xi)  {                 /* 当前行下移不会引起屏底超出数组则循环 */
      ser+=string_lingth()+2;        /* 计算下行首字序数 */
      ss_x++;      xx++;             /* 当前行移至下行 */
    }
    tj();                            /* 屏底要超出数组时,从 fp2 或 fp 读入 */
    if(fp_end && attl_x)  a=ttl_x;  /* 如目标行大于文末行时,目标行取文末行 */
  }
  while(xxa) {                      /* 目标行在当前行后则循环 */
    ser+=string_lingth()+2;          /* 计算下行首字序数 */
    ss_x++;    xx++;                 /* 当前行移至下行 */
  }
  orien();                           /* 定光标位置 */
  ser+=yy;                           /* 计算字序数 */
}

wfp1()                               /* 将编辑数组上部 Q3 行写入 fp1 */
{
  fseek(fp1,wra[oa],SEEK_SET);       /* 指针移到写入起始位置 */
  write_to(0,Q3,fp1);                /* 写 Q3 行到 fp1 */
  wra[++oa]=ftell(fp1);              /* 记录下一次写入起始位置 */
  movbk(0,Q3);                       /* 剩下的数组前移 Q3 行 */
  ss_x-=Q3;                          /* 计算编辑数组当前行行号 */
  ss_max-=Q3;                        /* 计算数组行实用最大行号 */
}

movbk(int s,int a)                   /* 编辑数组 s+a 行起前移 a 行 */
{
  int i;
  for(i=s;iQB-a;i++)
    strcpy(ss[i],ss[i+a]);           /* 前移 a 行,复盖原行 */
  while(iQB)   *ss[i++]=0;          /* 移走各行清 0 */

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

mov(int s,int a)                     /* 编辑数组 s 行起后移 a 行 */
{
  int i;
  for(i=QB-1;i=s+a;i--)  strcpy(ss[i],ss[i-a]);
}

tj()       /* 当前行大于 Q1 时,上部 Q3 行存入 fp1,从 fp2 或 fp 再读入 Q3 行 */
{
  int j=0;
  if(ss_xQ1-H3)  wfp1();            /* 当前行大于 Q1 时,上部 Q3 行存入 fp1 */
  if(ss_max=Q1) {                   /* 如编辑数组实用最大行在数组前半部 */
    if(ob)  {                        /* 如 fp2 中有记录 */
      fseek(fp2,wrb[--ob],SEEK_SET); /* 指针前移至读起始位置 */
      j=read_from(ss_max+1,Q3,fp2);  /* 从 fp2 读 Q3 行写入编辑数组最大行后,
                                            j 为实际读写数 */
      ss_max+=j;                     /* 数组扩大 j 行 */
    }
    else  if(!fp_end)  {             /* 如 fp2 已无记录,如 fp 中未读完 */
      j=read_from(ss_max+1,Q3,fp);   /* 从 fp 读 Q3 行写入数组最大行后,
                                            j 为实际读写数 */
      if(jQ3)  {                    /* 如读写数不足 Q3 行 */
        fp_rd+=j;                    /* fp 已读出最大行行号增加 j */
        ttl_x=fp_rd;                 /* 确定文末行行号 */
        fp_end=1;                    /* fp 已读完标志置 1 */
      }
      else  fp_rd+=Q3;               /* 否则,fp已读出行最大行号加 Q3 */
      ss_max+=j;                     /* 数组扩大 j 行 */
    }
  }
}

展开更多 50%)
分享

猜你喜欢

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

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

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

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

s8lol主宰符文怎么配

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

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

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

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

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

lol偷钱流符文搭配推荐

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

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

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

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

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

lolAD刺客新符文搭配推荐

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

更换驱动器的图标

更换驱动器的图标

JSP用bean获取各种参数

JSP用bean获取各种参数
下拉加载更多内容 ↓