#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(zhoulifa@163.com) 周立发(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; }
|