/*--version 1.0--*/
#include <stdio.h>
#include <cstdlib>
#define PAGELEN 24
#define LINELEN 512
void do_more(FILE *);
int see_more();
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);
}
}
}
void do_more(FILE *fp){
char line[LINELEN];
int num_of_lines = 0;
int reply;
while(fgets(line, LINELEN, fp)){
if(num_of_lines == PAGELEN){
reply = see_more();
if(0 == reply){
break;
}
/*這一段的作用:
1.如果reply==1,就是按了回車,num_of_lines=PAGELEN-1,所以只能顯示一行,num_of_lines就又變成了PAGELEN,繼續等待鍵盤輸入
2.如果reply==PAGELEN,就是按了空格,num_of_lines=0,所以可以顯示PAGELEN行,num_of_lines可以累加PAGELEN次,纔會等待鍵盤輸入*/
num_of_lines -= reply;
}
if(fputs(line, stdout) == EOF)
exit(1);
num_of_lines++;
}
}
int see_more()
{
int c;
printf("\033[7m more? \033[m");
while( (c = getchar()) != EOF )
{
if( c == 'q' )
return 0;
if( c == ' ' )
return PAGELEN;
if( c == '\n' )
return 1;
}
return 0;
}
VERSION 2.0 主要添加了對/dev/tty
的操作,使得再輸入被重定向時依然可以從鍵盤獲取用戶的輸入。/dev/tty
是鍵盤和顯示器的設備描述文件。
/*--version 2.0--*/
#include <stdio.h>
#include <cstdlib>
#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 reply;
FILE * 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(0 == reply){
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 PAGELEN;
if( c == '\n' )
return 1;
}
return 0;
}