求解答: 《Unix/Linux 编程实践教程》中 more命令实现代码的理解问题
- C/C++ code
#include <stdio.h>#define PAGELEN 24#define LINELEN 512void do_more(FILE *);int see_more();int main(int argc, char *argv[]){ FILE *fp; if(argc == 1) //不带参数运行,从标准输入读,即键盘 do_more(stdin); else{ while(-- argc) //问题:对于这个“ more < log.txt ”怎么理解? if((fp = fopen(* ++argv,"r")) != NULL){ //打开命令行参数所指定的文件 do_more(fp); fclose(fp); } else exit(1); return 0; }}void do_more(FILE *fp){ char line[LINELEN]; //缓冲区 每次从文件读LINELEN个字符 int num_of_lines = 0; int 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){ //将缓冲区中的内容写入到stdin(标准输入),也就是显示器终端 exit(1); } num_of_lines++; } }int see_more(){ int c; printf("\033[7m more? \033[m"); //在屏幕底部显示反白的“more?” while( (c = getchar())!= EOF ){ //接受键盘输入 if( c == 'q') //按q键退出程序 return 0; if( c == ' ') //按空格显示下一屏 return PAGELEN; if( c == '\n') //按回车显示下一行 return 1; return 0; }}
[解决办法]
有可能传递n个文件啊,这样argc就等于n+1,然后每递减一次都进行do_more的动作,相当于依次查看这n个文件。