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

本文介绍了一个使用C语言编写的more程序,该程序能够分页显示文本文件内容,并支持q、SpaceBar、Enter三个按键进行操作。文章提供了完整的源代码及实现原理。

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

这是自己用C语言编写的一个more程序,主要用到了终端控制和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:用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;
}

命令结果如下:

./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?

按空格键,翻到下一屏:

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?

按回车键,显示下一行:

{
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键退出:


关于控制符,请参看:

原文链接:http://bbs.chinaunix.net/viewthread.php?tid=266419

http://www.chinaunix.net 作者: jourmen 发表于:2006-06-27 16:27:04

[精华] [收集,整理]vt100的控制符文档


看到有人问了,
我贴一下:

格式: echo "/033[字背景颜色;字体颜色m字符串/033[0m"

例如:
echo "/033[41;36m something here /033[0m"

其中41的位置代表底色, 36的位置是代表字的颜色


那些ascii code 是对颜色调用的始末.
/033[ ; m …… /033[0m



字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

===============================================ANSI控制码的说明
/33[0m 关闭所有属性
/33[1m 设置高亮度
/33[4m 下划线
/33[5m 闪烁
/33[7m 反显
/33[8m 消隐
/33[30m -- /33[37m 设置前景色
/33[40m -- /33[47m 设置背景色
/33[nA 光标上移n行
/33[nB 光标下移n行
/33[nC 光标右移n行
/33[nD 光标左移n行
/33[y;xH设置光标位置
/33[2J 清屏
/33[K 清除从光标到行尾的内容
/33[s 保存光标位置
/33[u 恢复光标位置
/33[?25l 隐藏光标
/33[?25h 显示光标

【作者: Liberal】【访问统计:】【2007年10月26日 星期五 18:45】【注册】【打印】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值