Unix-Linux編程實踐教程——more

/*--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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章