他妈的KNOCKER。竟然将我的军,干嘛非得要今天晚上写出来。害得我累得趴在电脑前面睡着了。一觉起来竟然是5点了。赶紧爬起来写完了剩下的部分。
因为时间太紧了,根本没有时间来理顺思路,简直就是想到什么写什么。所以程序中有不妥当的地方请你多多多多指正。
#include <stdio.h> #include <dos.h> /*按键定义*/ #define RIGHT 0x4d00 #define LEFT 0x4b00 #define UP 0x4800 #define DOWN 0x5000 #define ESC 0x001b
static char texts[400][80]; /*文本记录。列、行*/
int presskey() /*有暂停按键判断函数*/ { unsigned key; key=bioskey(0); if(key<<8) key=key&0x00ff; return key; }
main() {
int i,line,x,y; unsigned key; FILE *fp; char fname[30];
textmode(2); /*定义显示模式*/ printf("\nPlease input FileName:"); scanf("%s",fname);
x=0;y=0;line=0; if((fp=fopen(fname,"r"))==NULL) exit(1); /*从文件中读取文本到texts*/ while((texts[y][x++]=fgetc(fp))!=EOF) { if(x==80) {x=0;y++;} if(texts[y][x-1]=='\n') { texts[y][x]=0; x=0;y++; } }
fclose(fp);
while((key=presskey())!=ESC) /*按键判断*/ { switch(key) { case UP : line--;break; case DOWN : line++;break; }
if(line<0) line=0; else if(line>y-24) line=y-24; else { clrscr(); for(i=line;i<line+24;i++) printf("%s",texts[i]); /*输出字符*/ }
}
}
好了,你看完我的程序了,把你的链表交出来吧,我想看看~~~
----------------解决方案--------------------------------------------------------
我头好晕,想睡觉。.......
----------------解决方案--------------------------------------------------------
你小子不睡觉?白天不上课啊?
----------------解决方案--------------------------------------------------------
我靠,knocker还好说,还不是为你那代码!你们什么时候又较上劲了?
----------------解决方案--------------------------------------------------------
晕啊,昨天我和神聊完就2点了,我下线就睡了,谁知道他.............
----------------解决方案--------------------------------------------------------
你们的厉害……我每天最晚10点半睡觉……
哎……怎么发现大家都开始变性了。
神也变成了毒女人……
----------------解决方案--------------------------------------------------------
你们的厉害……我每天最晚10点半睡觉……
哎……怎么发现大家都开始变性了。
神也变成了毒女人……
不好意思,我用这头像不是为了变性的,是左边那个女孩像我的某某,所以就用了。
knocker,神要上课的呀,不要逗他聊到深夜,虽然我也试过……
----------------解决方案--------------------------------------------------------
......
----------------解决方案--------------------------------------------------------
感谢大家对小弟的关心。现在才刚刚开学,很轻松的啦,昨天晚上我们还和四个舍友去女生宿舍门口数美女。
今天晚上舍友们又都出去开party了,就我一个没GF留在宿舍看门,正好有时间来整理下KNOCKER和我讨论的思路,个人觉得KNOCKER说得对,实现滚屏的确还是链表好操作一些。因为链表的特长就是很轻松的就可以实现插入和删除查找等等功能。所以我打算利用这段时间重新写过一个用链表来实现滚屏的程序。
界面我采用了80x25黑白显示(BW80)文本显示模式; 链表系统是用比较好操作的双向链表,每个链保存一行文字的信息。
这个程序的稳定性要比前一个大很多了,而且能支持较大的文本文件的显示,但是目前还没有左右滚屏的功能,所以一行显示的内容最好不超过80个字符,否则会折行显示。
如果大家想知道滚屏具体是如何实现的,就请发帖去问KNOCKER,他比我有空。
----------------解决方案--------------------------------------------------------
#include <stdio.h> #include <dos.h> #include <conio.h>
#define RIGHT 0x4d00 #define ENTER 0x000d #define LEFT 0x4b00 #define UP 0x4800 #define DOWN 0x5000 #define ESC 0x001b
int presskey() /*有暂停按键*/ { unsigned key; key=bioskey(0); if( key<<8 ) key=key&0x00ff; return key; }
struct lines { char *linetext; struct lines *prior; struct lines *next; }linex;
struct lines *start; struct lines *last;
void loadfile(char *fname); void show();
main() { char fname[30];
textmode(2); printf("\nPlese input FileName:"); scanf("%s",fname);
loadfile(fname); show(); getch(); }
void loadfile(char *fname) { char testtext[80]; struct lines *info,*i; FILE *fp;
if( (fp=fopen(fname,"r"))==NULL ) exit(1);
start=(struct lines *)malloc(sizeof(struct lines)); last =(struct lines *)malloc(sizeof(struct lines)); start->prior=NULL; start->next=last; last->next=NULL; last->prior=start; i=start;
for(;;) { info=(struct lines*)malloc(sizeof(struct lines)); if( fgets(testtext,80,fp)==NULL ) break; info->linetext=(char *)malloc(strlen(testtext)+1); strcpy(info->linetext,testtext);
info->next=i->next; i->next=info;
info->next->prior=info; info->prior=i; i=info; } fclose(fp); }
void show() { struct lines *beginline,*endline,*info; int i; unsigned key;
clrscr(); info=start->next; beginline=info; for(i=0;i<24;i++) { if(info->next==NULL) break; printf("%s",info->linetext); info=info->next; } endline=info->prior;
while( (key=presskey())!=ESC ) { switch(key) { case UP : { if( beginline->prior->prior==NULL ) break; _AH=7;_AL=1;_CH=0;_CL=0;_DH=24;_DL=79;_BH=143; geninterrupt(0x10); gotoxy(1,1); cprintf("%s",beginline->prior->linetext); beginline=beginline->prior; endline=endline->prior; break; }
case DOWN: { if( endline->next->next==NULL ) break; _AH=6;_AL=1;_CH=0;_CL=0;_DH=24;_DL=79;_BH=143; geninterrupt(0x10); gotoxy(1,24); cprintf("%s",endline->next->linetext); endline=endline->next; beginline=beginline->next; break; } } } }
----------------解决方案--------------------------------------------------------