歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

《Unix/Linux編程實踐教程》讀書筆記 ----more01.c所思

Unix/Linux編程實踐教程【高清PDF中文版+附錄光盤+代碼】下載地址: http://www.linuxidc.com/Linux/2011-08/41374.htm

章節: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. }     
Copyright © Linux教程網 All Rights Reserved