章节:1.6
页数:17
原程序:more01.c
#include <stdio.h>#include <stdlib.h>#define PAGELEN 24#define LINELEN 512void do_more(FILE *);int see_more();int main(int ac, char *av[]){ FILE *fp; if( ac == 1 ) do_more(stdin); //stdin 是标准输入,可以是来自键盘的输入,还可以来自被重定向的管道输入 else while( --ac ) /*若ac=2,则 -1 后,表示第2个参数,一般是要显示的文件名*/ 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; 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.当以./moreo1无参数运行时,是不会打开输入的文件名的,而只是将输入内容在输出一遍。如下:
为弥补上述,现修改如下:
#include<stdio.h>#include <string.h>#include <errno.h>#define PAGELEN 24#define LINELEN 512void do_more(FILE *);int see_more();int main(int argc,char* argv[]){FILE *fp;char line[LINELEN];if(argc==1){scanf ("%s",line);if((fp = fopen (line,"r"))!=NULL){do_more(fp);close(fp);}else printf(strerror(errno));}else{while(--argc);if((fp=fopen(*++argv,"r+"))!=NULL){do_more(fp);close(fp);}elseexit(1); }return 0;}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(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==' '){getchar();return PAGELEN;}if(c=='\n')return 1;}return 0;}
自然而然不想去因为别人的努力而努力,