注:很兴奋看到网友 hua 仍能保持高度的热情继续编辑器的编写,现在各种各样的编辑器很多,编辑器的编写虽不是很复杂的程序,但要完成也绝不轻松.本人学习 c 也有一段时间了,所以很愿意加入 hua 一起研究编辑器,我相信这句话:"试了不一定成功,但不试就一定不成功".
------------------------------------------------------------
作者:hua
太贪心,想文件读入,光标控制,删除控制和虚屏显示等的功能一块完成,结果问题多多,最后终于连程序都不能用了~~~~o~~~~
不得不从头来过,总算是完成了删除功能的同步,就是显示与文件存储已能够同步了...
源代码edit.c:
#include
#include
#include
#define STARTX 1
#define STARTY 1
void initial()
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
struct {
char name[200000];
} edit;
int main(int argc,char *argv[])
{
int x=STARTX;
int y=STARTY;
int max[2000],ch,i,a,net[2000],sizefile=0;
char line[100];
FILE *fp;
if(argc==1 || argc>2) {
printf("please input:./edit file\\nexit:Esc\\n");
}
if(argc==2) {
fp=fopen(argv[1],"w");
initial();
//box(stdscr,ACS_VLINE,ACS_HLINE);
move(0,30);
printw("edit- %s",argv[1]);
refresh();
move(x,y);
do{
ch=getch();
switch(ch){
case KEY_UP:
if(y>1) --y;
move(y,x);
break;
case KEY_DOWN:
++y;
break;
case KEY_RIGHT:
++x;
break;
case KEY_LEFT:
if(x>1) --x;
break;
case '\\r':
if (y==1) {
for (a=0,i=(x-1);i<=net[1];i++,a++) {
line[a]=edit.name[i];
}
line[a+1]='\\0';
} else {
for (i=1;i
sizefile=net[i]+sizefile;
}
for (a=0,i=x;i<=net[y];i++,a++) {
line[a]=edit.name[sizefile+i];
}
line[a+1]='\\0';
}
sizefile=0;
if (x
for (i=net[y];i>=x;i--) {
delch();
}
}
if (y==1) {
for (i=strlen(edit.name);i>=(x-1);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+2]='\\0';
edit.name[x-1]='\\n';
net[1]=x-1;
} else {
for (i=1;i
sizefile=net[i]+sizefile;
}
for (i=strlen(edit.name);i>=(sizefile+x);i--) {
edit.name[i+1]=edit.name[i];
}
edit.name[strlen(edit.name)+2]='\\0';
edit.name[sizefile+x]='\\n';
net[y]=x;
sizefile=0;
}
++y;
x=1;
move(y,x);
insertln();
printw("%s",line);
for(i=2000;i>=y;i--) {
net[i]=net[i-1];
}
net[y]=strlen(line);
memset(line,'\\0',sizeof(line));
break;
case '\\t':
x+=4;
break;
case KEY_BACKSPACE:
/* 向前删除控制,数组内容向前移一位控制 */
if (y==1) {
for (i=(x-2);i
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[1]=net[1]-1;
} else {
for (i=1;i
sizefile=net[i]+sizefile;
}
for(i=(sizefile+x-1);i
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[y]=net[y]-1;
sizefile=0;
}
if(x>1) --x;
move(y,x);
if (x>1) {
delch();
} else {
addch(' ');
}
break;
case KEY_DC:
/* 向后删除控制,数组内容向前移一位控制 */
if (y==1) {
for (i=(x-1);i<=strlen(edit.name);i++) {
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[1]=net[1]-1;
} else {
for (i=1;i
sizefile=net[i]+sizefile;
}
for(i=(sizefile+x);i
edit.name[i]=edit.name[i+1];
}
edit.name[strlen(edit.name)]='\\0';
net[y]=net[y]-1;
sizefile=0;
}
delch();
break;
case 27:
fwrite(&edit.name,sizeof(edit.name),1,fp);
endwin();
printf("name:%s\\n",edit.name);
exit(0);
default:
insch(ch);
if (y==1) {
edit.name[x-1]=ch;
} else {
for(i=1;i
sizefile=net[i]+sizefile;
}
edit.name[sizefile+x]=ch;
sizefile=0;
}
if (max[y]
max[y]=x;
}
net[y]=max[y];
x++;
break;
}
move(y,x);
}while(1);
}
}
做字符插入控制时碰到了很大问题,主要在行计数和数组控制上碰到麻烦,主要表现为在光标位插入字符,在数组上应该后移,然后把字符写入,可是这里的控制太复杂.想请高手帮忙看看,该如何解决这个问题...
视频教程列表
文章教程搜索
C语言程序设计推荐教程
C语言程序设计热门教程
|