这是自己用C语言编写的一个more程序,主要用到了终端控制和C语言的控制符功能,源代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
#include <stdlib.h> #include <stdio.h> #include <string.h> /*定义页面行数和每个最大长度*/ #define PAGELEN 24 #define LINELEN 80 void do_more(FILE *); int get_more_cmd(FILE *); /*定义已经读取的字节数和文件总字节数*/ int read_size, total_size; /************关于本文档******************************************** *filename:用C语言自己编写一个more程序 *purpose:自己编写的一个more程序,里面有终端控制方法,只支持q、SpaceBar、Enter三个按键 *wrote by: zhoulifa([email protected]) 周立发(http://zhoulifa.bokee.com) Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言编程 *date time:2006-07-16 15:00:00 *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 * 但请遵循GPL。 *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力 *********************************************************************/ int main( int argc , char **argv ) { FILE *fp; if ( argc == 1 ) do_more( stdin ); else { system ("stty -F /dev/tty cbreak");/*打开/dev/tty作为输入终端,并且控制属性为不需要回车*/ while ( --argc )/*逐个处理每个要显示的文件*/ if ( (fp = fopen( *++argv , "r" )) != NULL )/*打开文件*/ { do_more( fp ) ;/*显示文件内容*/ fclose( fp ); } else exit(1); system ("stty -F /dev/tty -cbreak");/*恢复终端属性为需要回车*/ } return 0; } void do_more( FILE *fp ) { char line[LINELEN]; int num_of_lines = 0; int reply; FILE *fp_tty; if (fp != stdin) { /*取得文件总字节数*/ fseek (fp, 0, SEEK_END); total_size = ftell (fp); fseek (fp, 0, SEEK_SET); } fp_tty = fopen( "/dev/tty", "r" ); /*打开命令输入流*/ if ( fp_tty == NULL ) exit(1); while ( fgets( line, LINELEN, fp ) ){ /*读取要显示的内容*/ read_size += strlen(line); if ( num_of_lines == PAGELEN ) { /*判断是否显示满一屏*/ reply = get_more_cmd(fp_tty); /*等待输入下一个命令*/ if ( reply == 0 ) /*退出命令*/ break; num_of_lines -= reply; /*行数清零*/ } if ( fputs( line, stdout ) == EOF ) /*显示读取的内容*/ exit(1); num_of_lines++; /*记录已经读取的行数*/ } } int get_more_cmd(FILE *cmd) /*接受用户命令,显示比例并等待用户输入命令,只支持三个命令字*/ { int c; printf ("\033[7m - %d/%d - more? \033[0m", read_size, total_size); /*用ASCII码控制字进行反显*/ while( (c=getc(cmd)) != EOF ) /* 从终端读入命令*/ { if ( c == 'q' ) /*退出命令q*/ {printf("\n");return 0;} if ( c == ' ' ) /*空格命令,显示下一屏*/ {printf("\033[2J"); return PAGELEN;} /*清屏,并返回屏幕大小*/ if ( c == '\n' ) /*回车命令,显示下一行*/ {printf("\033[A\033[2K");return 1;}/*削除上一行显示信息并返回要显示下一行*/ } return 0; } |
命令结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
./a.out more02.c #include <stdlib.h> #include <stdio.h> #include <string.h> /*定义页面行数和每个最大长度*/ #define PAGELEN 24 #define LINELEN 80 void do_more(FILE *); int get_more_cmd(FILE *); /*定义已经读取的字节数和文件总字节数*/ int read_size, total_size; /************关于本文档******************************************** *filename:自己编写一个more程序 *purpose:自己编写的一个more程序,里面有终端控制方法,只支持q、SpaceBar、Enter三个按键 *wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com) Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言编程 *date time:2006-07-16 15:00:00 *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 * 但请遵循GPL。 *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力 *********************************************************************/ - 991/3085 - more? |
按空格键,翻到下一屏:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
int main( int argc , char **argv ) { FILE *fp; if ( argc == 1 ) do_more( stdin ); else { system ("stty -F /dev/tty cbreak");/*打开/dev/tty作为输入终端,并且控制属性为不需要回车*/ while ( --argc )/*逐个处理每个要显示的文件*/ if ( (fp = fopen( *++argv , "r" )) != NULL )/*打开文件*/ { do_more( fp ) ;/*显示文件内容*/ fclose( fp ); } else exit(1); system ("stty -F /dev/tty -cbreak");/*恢复终端属性为需要回车*/ } return 0; } void do_more( FILE *fp ) { - 1554/3085 - more? |
按回车键,显示下一行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ FILE *fp; if ( argc == 1 ) do_more( stdin ); else { system ("stty -F /dev/tty cbreak");/*打开/dev/tty作为输入终端,并且控制属性为不需要回车*/ while ( --argc )/*逐个处理每个要显示的文件*/ if ( (fp = fopen( *++argv , "r" )) != NULL )/*打开文件*/ { do_more( fp ) ;/*显示文件内容*/ fclose( fp ); } else exit(1); system ("stty -F /dev/tty -cbreak");/*恢复终端属性为需要回车*/ } return 0; } void do_more( FILE *fp ) { char line[LINELEN]; - 1579/3085 - more? |
按q键退出:
关于控制符,请参看:vt100的控制符文档
发表评论
要发表评论,您必须先登录。