歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 《Unix/Linux編程實踐教程》讀書筆記 ----more01.c所思

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

日期:2017/3/1 10:24:45   编辑:Linux編程
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. #define PAGELEN 24
  4. #define LINELEN 512
  5. void do_more(FILE *);
  6. int see_more();
  7. int main(int ac, char *av[])
  8. {
  9. FILE *fp;
  10. if( ac == 1 )
  11. do_more(stdin); //stdin 是標准輸入,可以是來自鍵盤的輸入,還可以來自被重定向的管道輸入
  12. else
  13. while( --ac ) /*若ac=2,則 -1 後,表示第2個參數,一般是要顯示的文件名*/
  14. if( (fp = fopen(* ++av, "r")) != NULL )
  15. {
  16. do_more( fp );
  17. fclose( fp );
  18. }
  19. else
  20. exit(1);
  21. return 0;
  22. }
  23. void do_more( FILE *fp )
  24. {
  25. char line[LINELEN];
  26. int num_of_lines = 0;
  27. int reply;
  28. while( fgets( line, LINELEN, fp ) ){
  29. if( num_of_lines == PAGELEN ){
  30. reply = see_more(); //從輸入流中取值,可能來自鍵盤,也可能是來自別的命令中的重定向
  31. if( reply == 0 )
  32. break;
  33. num_of_lines -= reply; //按要求顯示內容
  34. }
  35. if( fputs(line, stdout) == EOF ) //輸出
  36. exit(1);
  37. num_of_lines++;
  38. }
  39. }
  40. int see_more()
  41. {
  42. int c;
  43. printf("\033[7m more? \033[m");
  44. while( (c = getchar()) != EOF )
  45. {
  46. if( c == 'q' )
  47. return 0;
  48. if( c == ' ' )
  49. return PAGELEN;
  50. if( c == '\n' )
  51. return 1;
  52. }
  53. return 0;
  54. }

不足:

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. void do_more(FILE *fp)
  29. {
  30. char line[LINELEN];
  31. int num_of_lines=0;
  32. int reply;
  33. while(fgets(line,LINELEN,fp)){
  34. if(num_of_lines==PAGELEN){
  35. reply=see_more();
  36. if(reply==0)break;
  37. num_of_lines-=reply;
  38. }
  39. if(fputs(line,stdout)==EOF)
  40. exit(1);
  41. num_of_lines++;
  42. }
  43. }
  44. int see_more()
  45. {
  46. int c;
  47. printf("\033[7m more? \033[m");
  48. while((c=getchar())!=EOF)
  49. {
  50. if(c=='q')return 0;
  51. if(c==' '){
  52. getchar();
  53. return PAGELEN;
  54. }
  55. if(c=='\n')return 1;
  56. }
  57. return 0;
  58. }
Copyright © Linux教程網 All Rights Reserved