实现more命令

117 阅读1分钟

more命令

用于分屏显示大文件 more filename

实现思路

设置每屏打印多少 行数、每行字符数
打开目标文件
打开/dev/tty 接收键盘输入
读取一行,打印一行
打印一屏后询问用户是否继续

代码

// more.h
#ifndef MYMORE_H__
#define MYMORE_H__

#include <stdio.h>

#define PAGELEN 20
#define LINELEN 100

int see_more(void);

void do_more(FILE *fp);

#endif
// more.c
#include "more.h"

int see_more(void) {
    char ch;
    while((ch = getchar()) != EOF) {
        if(ch == 'q')
            return 0;        // 退出
        if(ch == ' ')
            return PAGELEN;  // 再打印一屏
        if(ch == '\n')
            return 1;        // 再打印一行
    }
}

void do_more(FILE *fp) {
    FILE *tty_fp;
    char buffer[LINELEN];
    int num_of_line = 0;
    int reply;
    
    while(fgets(buffer, LINELEN, fp)) {
        if(num_of_line == PAGELEN) {
            reply = see_more();  // 打印完一屏,判断是否继续打印
            if(reply == 0)
                break;
            num_of_line -= reply;
        }
        if(fputs(buffer, stdout))
            return;
        num_of_line ++;
    }
}
// main.c
#include "more.h"

int main(int argc, char *argv[]) {
    FILE *fp;
    if(argc == 1) {
        do_more(stdin);
    } else {
        if((fp = fopen(*++argv, "r")) != NULL) {
            do_more(fp);
            fclose(fp);
        } else {
            return -1;
        }
    }
    
    return 0;
}
makefile
OBJS=main.o more.o
CC=gcc
CFLAGS+=-c -Wall -g -o

more:$(OBJS)
    $(CC) $(OBJS) -o more
%.o:%.c
    $(CC) $^ $(CFLAGS) $@
clean:
    rm more *.o -rf

结果

屏幕截图 2023-09-10 060338.png