Linux下用C语言实现简单的more的功能

Linux下more的基本功能:

     more可以分页显示文件的内容。有时候我们系统中的文件可能比较大,一个屏可能显示不完所有内容,所以我们经常用more来分页显示文件中的内容。

more有三种用法:

    1. more filename

    例: more binsearch.c

  1

2

按下Enter键会自动向下滚动

3

    2. command | more

    例: ls | more   :分页显示该文件夹所有文件

   4

  

    3. more < filename

    例:more <binsearch.c  与 more binsearch.c效果一样,只是把内容重定向到输出

   注: “<”和“>” 的重定向主要是对于 /dev/tty的读、写操作来实现,向该文件写表示显示在用户的屏幕上,读该文件表示从键盘获取用户的输入。

   

 

 

 

more的工作流程:
     +------>show 24 lines from input
     |  +--->print [more?] message
     |   |      Input Enter,SPACE or q
     |  +---  if Enter,advance one line
    + ------  if SPACE
      if q----> exit

  1 /*more.c 
2
3 *read and print 24 lines then pause for a few special commands
4 */
5 #include <stdio.h>
6
7
8 #define PAGELEN 24
9
10 #define LINELEN 512
11
12 void do_more(FILE *);
13
14 int see_more(FILE *);
15
16 int main(int argc,char *argv[])
17
18 {
19 FILE *fp;
20
21 if (argc==1)
22
23 {
24
25 do_more(stdin);
26
27 }
28
29 else
30
31 {
32
33 while (--argc)
34
35 {
36
37 if((fp=fopen(*++argv,"r"))!=NULL)
38
39 {
40
41 do_more(fp);
42
43 fclose(fp);
44
45 }else
46
47 exit(0);
48
49 }
50
51 }
52
53 return 0;
54
55 }
56
57
58 void do_more(FILE *fp)
59
60 {
61
62 char line[LINELEN];
63
64 int num_of_lines=0;
65
66 int reply;
67
68 FILE * fp_tty;
69
70 fp_tty=fopen("/dev/tty","r");
71
72 if(fp_tty==NULL)
73
74 exit(1);
75
76 while(fgets(line,LINELEN,fp))
77 {
78
79 if(num_of_lines==PAGELEN){
80
81 reply=see_more(fp_tty);
82
83 if(reply==0)
84
85 break;
86
87 num_of_lines-=reply;
88
89 }
90
91 if(fputs(line,stdout)==EOF)
92
93 exit(1);
94
95 num_of_lines++;
96
97 }
98
99 }
100
101
102 int see_more(FILE *cmd)
103
104 {
105
106 int c;
107
108 printf("\033[7m more?\033[m");
109
110 while((c=getc(cmd))!=EOF)
111
112 {
113
114 if(c=='q')
115
116 return 0;
117
118 if(c==' ')
119
120 return PAGELEN;
121
122 if(c=='\n')
123
124 return 1;
125
126 }
127
128 return 0;
129
130 }

参考《UNIX/Linux编程实践教程》

 
posted @ 2012-02-19 00:59  芬达·橙  阅读(1354)  评论(0)    收藏  举报