织梦CMS - 轻松建站从此开始!

罗索

用C语言自己编写一个more程序

jackyhwei 发布于 2011-04-19 20:27 点击:次 
这是自己用C语言编写的一个more程序,主要用到了终端控制和C语言的控制符功能,源代码如下:
TAG:

这是自己用C语言编写的一个more程序,主要用到了终端控制和C语言的控制符功能,源代码如下:

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

命令结果如下:

./a.out more02.c

按空格键,翻到下一屏.
按回车键,显示下一行.
按q键退出.
 

(周立发)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201104/11243.html]
本文出处:zhoulifa.bokee.com 作者:周立发
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容