注:鉴于 hua,linuxhero 两位网友对编辑器的开发热情,本站已与两位网友取得联系,他们同意将改进编辑器的最新情况公布在非常论坛上,所以本站决定随时跟踪两位网友的研发情况,并把最新的研发代码在文章区发表.
对编辑器的改进感爱好的网友可到非常论坛加入他一起研究.
-----------------------------------------------------------
作者:hua
linuxhero兄,我已测试过你修改的程序了,发现存储文档时与显示格式不同,在文件存储的内容里没有断行,所以我修改了程序,在回车时增加了断行符进name数组,修改后的文件存储与显示格式已同步了.
于是我再接再厉继续改进回车功能,但是碰到麻烦了,我原意想把断行的显示效果做得与pico编辑器一样,增加完代码后,测试时发现从上到下断行时铁定出现问题,而从下到上进行断行显示效果却与pico的断行效果一样.我对代码看了有看,改了又改,还是出现这个问题,我现在就把最后一次修改的代码贴出来,帮忙看看问题出在哪里.
#include<unistd.h>
#include<stdio.h>
#include<curses.h>
#define STARTX 1
#define STARTY 1
void initial()
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
int main(int argc,char *argv[])
{
int x=STARTX;
int y=STARTY;
int ch,i,a,net[2000],sizefile=0;
char name[200000],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':
/* 下面这段代码是把光标所在位置到这行结束的所有字符拷贝进数组line */
if (y==1) {
for (a=0,i=(x-1);i<=net[1];i++,a++) {
line[a]=name[i];
}
line[a+1]='\\0';
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
for (a=0,i=x;i<=net[y];i++,a++) {
line[a]=name[sizefile+i];
}
line[a+1]='\\0';
}
/* 下面这段代码是把从光标开始到这行结束的所有字符删除 */
if (x<net[y]) {
for (i=net[y];i>=x;i--) {
delch();
}
net[y]=x-1;
}
/* 下面是对文件存储的断行处理 */
if (y==1) {
name[x-1]='\\n';
name[x]='\\0';
net[1]=x-1;
} else {
for (i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
name[sizefile+x]='\\n';
name[sizefile+x+1]='\\0';
net[y]=x;
sizefile=0;
}
++y;
x=1;
move(y,x);
insertln();
/* 在断行后,新的行显示上一行自光标以后的字符 */
printw("%s",line);
break;
case '\\t':
x+=4;
break;
case KEY_BACKSPACE:
if(x>1) --x;
move(y,x);
if (x>1) {
delch();
} else {
addch(' ');
}
break;
case KEY_DC:
delch();
break;
case 27:
fwrite(&name,sizeof(name),1,fp);
endwin();
printf("test name:%s\\n",name);
exit(0);
default:
insch(ch);
if (y==1) {
name[x-1]=ch;
name[x]='\\0';
} else {
for(i=1;i<y;i++) {
sizefile=net[i]+sizefile;
}
name[sizefile+x]=ch;
name[sizefile+x+1]='\\0';
sizefile=0;
}
net[y]=x;
x++;
break;
}
move(y,x);
}while(1);
}
}
上面就是代码了,我的头都改大了,请帮忙看看问题出在哪里,也请其他高手帮忙看看,这里先谢谢了!
视频教程列表
文章教程搜索
C语言程序设计推荐教程
C语言程序设计热门教程
|