《Unix/Linux编程实践教程》读书笔记 ----more01.c所思


Unix/Linux编程实践教程【高清PDF中文版+附录光盘+代码】下载地址:

章节:1.6

页数:17

原程序:more01.c

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3.   
  4. #define PAGELEN 24   
  5. #define LINELEN 512   
  6.   
  7. void do_more(FILE *);  
  8. int see_more();  
  9.   
  10.   
  11. int main(int ac, char *av[])  
  12. {  
  13.     FILE *fp;  
  14.     if( ac == 1 )  
  15.     do_more(stdin);  //stdin 是标准输入,可以是来自键盘的输入,还可以来自被重定向的管道输入   
  16.     else  
  17.     while( --ac )  /*若ac=2,则 -1 后,表示第2个参数,一般是要显示的文件名*/  
  18.         if( (fp = fopen(* ++av, "r")) != NULL )   
  19.         {  
  20.         do_more( fp );  
  21.         fclose( fp );  
  22.         }  
  23.         else  
  24.         exit(1);      
  25.     return 0;  
  26. }  
  27.   
  28. void do_more( FILE *fp )  
  29. {  
  30.     char line[LINELEN];  
  31.     int num_of_lines = 0;  
  32.     int reply;  
  33.   
  34.     while( fgets( line, LINELEN, fp ) ){  
  35.     if( num_of_lines == PAGELEN ){  
  36.         reply = see_more();    //从输入流中取值,可能来自键盘,也可能是来自别的命令中的重定向   
  37.         if( reply == 0 )  
  38.         break;  
  39.         num_of_lines -= reply;  //按要求显示内容   
  40.     }  
  41.     if( fputs(line, stdout) == EOF )   //输出   
  42.         exit(1);  
  43.     num_of_lines++;  
  44.     }  
  45. }  
  46.   
  47. int see_more()  
  48. {  
  49.     int c;  
  50.     printf("\033[7m more? \033[m");  
  51.   
  52.     while( (c = getchar()) != EOF )  
  53.     {  
  54.     if( c == 'q' )  
  55.         return 0;  
  56.     if( c == ' ' )  
  57.         return PAGELEN;  
  58.     if( c == '\n' )  
  59.         return 1;  
  60.     }  
  61.     return 0;  
  62. }  

不足:

1.当以./moreo1无参数运行时,是不会打开输入的文件名的,而只是将输入内容在输出一遍。如下:

2.当输入空格企图看下一页时,会自动在显示下一页之后,显示后一行。如下:

为弥补上述,现修改如下:

  1. #include<stdio.h>   
  2. #include <string.h>   
  3. #include <errno.h>   
  4. #define PAGELEN 24   
  5. #define LINELEN 512   
  6. void do_more(FILE *);  
  7. int see_more();  
  8. int main(int argc,char* argv[])  
  9. {  
  10.     FILE *fp;  
  11.     char line[LINELEN];  
  12.     if(argc==1){  
  13.         scanf ("%s",line);  
  14.         if((fp = fopen (line,"r"))!=NULL){  
  15.             do_more(fp);  
  16.             close(fp);  
  17.         }else printf(strerror(errno));  
  18.     }else{  
  19.         while(--argc);  
  20.         if((fp=fopen(*++argv,"r+"))!=NULL){  
  21.             do_more(fp);  
  22.             close(fp);  
  23.         }else  
  24.             exit(1);  
  25.           }  
  26.     return 0;  
  27. }  
  28.   
  29. void do_more(FILE *fp)  
  30. {  
  31.     char line[LINELEN];  
  32.     int num_of_lines=0;  
  33.     int reply;  
  34.     while(fgets(line,LINELEN,fp)){  
  35.         if(num_of_lines==PAGELEN){  
  36.             reply=see_more();  
  37.             if(reply==0)break;  
  38.             num_of_lines-=reply;  
  39.         }  
  40.             if(fputs(line,stdout)==EOF)  
  41.             exit(1);  
  42.     num_of_lines++;  
  43.     }  
  44. }  
  45.   
  46. int see_more()  
  47. {  
  48.     int c;  
  49.     printf("\033[7m more? \033[m");  
  50.     while((c=getchar())!=EOF)  
  51.     {  
  52.         if(c=='q')return 0;  
  53.         if(c==' '){  
  54.             getchar();  
  55.             return PAGELEN;  
  56.         }  
  57.         if(c=='\n')return 1;  
  58.           
  59.     }  
  60.     return 0;  
  61. }     

相关内容