more命令的基本实现

#include 
#include 
#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);
            }   
        }
    }
    return 0;
}

void do_more(FILE* fp) {
    char line[LINELEN];
    int num_of_lines = 0;
    int see_more(), 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++;
    }
}

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;
}

分析上述代码的不足:
从上述代码可以知道,若没有命令行参数,则会从标准输入读取数据。


图-1.1
image.png

你可能感兴趣的:(more命令的基本实现)