此僅爲個人學習總結,沒有其他意圖,如有不當之處,還請指出,謝謝。
首先將經典的 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") 相當於從終端讀取。