此仅为个人学习总结,没有其他意图,如有不当之处,还请指出,谢谢。
首先将经典的 more.c 抄写下来,然后再作个人的相关分析。
#include<stdio.h>
#include<stdlib.h>
#define PAGELEN 24
#define LINELEN 512
void do_more(FILE *)
int see_more(FILE *)
int main(int ac,char *av[])
{
FILE *fp;
if(ac==1)
do_more(stdin);
else
while(--ac)
if((fp=fopen("++av","r")) != NULL)
{
do_more(fp);
fclose(fp);
}
else
exit(1);
return 0;
}
void do_more(FILE *fp)
{
char line[LINELEN];
int num_of_lines=0;
int see_more(FILE *),reply;
FILE *fp_tty;
fp_tty = fopen("/dev/tty","r");
if(fp_tty == NULL)
exit(1);
while(fgets(line,LINELEN,fp)){
if(num_of_lines==PAGELEN){
reply = see_more(fp_tty);
if(reply==0)
break;
num_of_lines - =reply;
}
if(fputs(line,stdout)==EOF)
exit(1);
num_of_lines++;
}
}
int see_more(FILE *cmd)
{
int c;
printf("/033[7m more?/033[m");
while((c=getc(cmd)) != EOF)
{
if(c=='q')
return 0;
if(c==' ')
return PAGEKEN;
if(c=='/n')
return 1;
}
return 0;
}
首先,more.c程序能做什么呢?它能显示一个文件的内容,也就是说,它会将你的想看的文件内容显示在屏幕上。那么,我们怎么来显示呢?
第一次会显示屏幕能容纳的部分内容,然后,根据你的要求做出相应的反应,你有三种选择:1.在显示一屏幕。2.在显示一行。3.退出。当所有的内容都显示完了后也退出。
现在,我们可以设计它的流程了。
1.显示一屏幕的内容
2.问, 空格 or 回车 or q 。
3.如果,空格,则在显示一屏幕。
4.如果,回车,则在显示一行。
5.如果,q ,则退出。
此程序当执行 ls /bin | ./more时会出现bug
修改 see_more() 成see_more(FILE *)
FILE * cmd = fopen(“/dev/tty”,"r") 相当于从终端读取。