Linux下用C语言实现简单的more的功能
Linux下more的基本功能:
more可以分页显示文件的内容。有时候我们系统中的文件可能比较大,一个屏可能显示不完所有内容,所以我们经常用more来分页显示文件中的内容。
more有三种用法:
1. more filename
例: more binsearch.c
按下Enter键会自动向下滚动
2. command | more
例: ls | more :分页显示该文件夹所有文件
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编程实践教程》




浙公网安备 33010602011771号