📄 全屏幕编辑软件的编写.txt
字号:
}
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 + -