UNIX/LINUX编程实战教程——读书笔记一

来源:互联网 发布:淘宝店家进货方式 编辑:程序博客网 时间:2024/06/10 11:50

UNIX/LINUX编程实战教程读书笔记 ,开篇以more指令来进入:

more可以分页显示文件的内容,大部分的Unix系统都有文本文件“ /etc/termcap”,我使用的CentOS上也有,它经常被文本编辑器和游戏程序用到,那么用“ cat /etc/termcap”来查看的时候,通常一页是显示不完,太长了,这样more的价值出来了,使用“more ****”或者“cat **** | more”。

SO,它会显示文件第一屏的内容,在屏幕的底部,more用反白字体显示文件的百分比,这时如果按空格键,文件的下一屏内容会显示出来,如果按回车键,显示的则是下一行,如果输入“q”,结束显示,如果输入“h”,显示出来的是more的联机帮助。

本书在后面用它提及的方法来展示了自己编写more功能的代码,下面会把它贴上来 ,有个地方不会一样,就是觉得17面的程序中,因为它全局已经声明了一下“int see_more();”,我就在do_more()函数里把“int see_more()”给注释了。还是要多看看代码:

/*more01.c -- version 0.1 of more *read and print 24 lines then pause for a few special commands */#include <stdio.h>#include <stdlib.h>#define PAGELEN 24#define LINELEN 512void do_more(FILE *);int see_more();int main(int ac, char *av[]){FILE *fp;if(ac == 1)do_more(stdin);elsewhile(--ac){if((fp=fopen(* ++av,"r"))!= NULL){do_more(fp);fclose(fp);}elseexit(1);}return 0;}/* *read PAGELEN lines, then call see_more() for further instructions */void do_more(FILE *fp){char line[LINELEN];int num_of_lines = 0;//int see_more(), reply;int reply;while(fgets(line,LINELEN,fp)){if(num_of_lines == PAGELEN){reply = see_more();if(reply == 0)break;num_of_lines -= reply;}if(fputs(line,stdout) == EOF)exit(1);num_of_lines++;}}/* *print message, wait for reponse, return # of lines to advance *q means no, space means yes, CR means one line */int see_more(){int c;printf("\033[7m more?\033]");while((c=getchar())!= EOF){if(c == 'q')return 0;if(c == ' ')return PAGELEN;if(c == '\n')return 1;}return 0;}

下面一个是在以上面为基础而更完善的一点功能的程序:

/*more02.c -- version 0.2 of more *read and print 24 lines then pause for a few special commands *feature of version of 0.2: reads from /dev/tty for commands   */#include <stdio.h>#include <stdlib.h>#define PAGELEN 24#define LINELEN 512void do_more(FILE *);int see_more(FILE *);//it is different from more01.c,//"Note" stands for this difference.int main(int ac, char *av[]){FILE *fp;if(ac == 1)do_more(stdin);elsewhile(--ac){if((fp=fopen(* ++av,"r"))!= NULL){do_more(fp);fclose(fp);}elseexit(1);}return 0;}/* *read PAGELEN lines, then call see_more() for further instructions */void do_more(FILE *fp){char line[LINELEN];int num_of_lines = 0;//int see_more(), reply;int reply;FILE *fp_tty;                 //Notefp_tty = fopen("/dev/tty","r");  //Noteif(fp_tty == NULL)  //Noteexit(1);  //Notewhile(fgets(line,LINELEN,fp)){if(num_of_lines == PAGELEN){reply = see_more(fp_tty);  //Noteif(reply == 0)break;num_of_lines -= reply;}if(fputs(line,stdout) == EOF)exit(1);num_of_lines++;}}/* *print message, wait for reponse, return # of lines to advance *q means no, space means yes, CR means one line */int see_more(FILE *cmd)//Note{int c;printf("\033[7m more? \033[m");while((c=getc(cmd))!= EOF)//Note{if(c == 'q')return 0;if(c == ' ')return PAGELEN;if(c == '\n')return 1;}return 0;}

本书后面还留了点问题,可以更加完善后就和系统的more指令完成的功能一样了。后面会通过学习来解决它的。先到这样。

原创粉丝点击