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