Unix/Linux編程實踐教程【高清PDF中文版+附錄光盤+代碼】下載地址: http://www.linuxidc.com/Linux/2011-08/41374.htm
章節:1.6
頁數:17
原程序:more01.c
- #include <stdio.h>
- #include <stdlib.h>
-
- #define PAGELEN 24
- #define LINELEN 512
-
- void 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無參數運行時,是不會打開輸入的文件名的,而只是將輸入內容在輸出一遍。如下:
2.當輸入空格企圖看下一頁時,會自動在顯示下一頁之後,顯示後一行。如下:
為彌補上述,現修改如下:
- #include<stdio.h>
- #include <string.h>
- #include <errno.h>
- #define PAGELEN 24
- #define LINELEN 512
- void 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);
- }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==' '){
- getchar();
- return PAGELEN;
- }
- if(c=='\n')return 1;
-
- }
- return 0;
- }