linux中more的功能,如何用c语言实现linux中more命令功能

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

rsdab

2014.08.14

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:51%    等级:7

已帮助:909人

/* more01.c - version 0.1 of more

* read and print 24 lines then pause for a few special commands

*/

#include

#define PAGELEN 24

#define LINELEN 512

void do_more(FILE *);

int see_more();

int main( int ac , char *av[] )

{

FILE *fp;

if ( ac == 1 )

do_more( stdin );

else

while ( --ac )

if ( (fp = fopen( *++av , "r" )) != NULL )

{

do_more( fp ) ;

fclose( fp );

}

else

exit(1);

return 0;

}

void do_more( FILE *fp )

/*

* read PAGELEN lines, then call see_more() for further instructions

*/

{

char line[LINELEN];

int num_of_lines = 0;

int see_more(), reply;

while ( fgets( line, LINELEN, fp ) ){ /* more input */

if ( num_of_lines == PAGELEN ) { /* full screen? */

reply = see_more(); /* y: ask user */

if ( reply == 0 ) /* n: done */

break;

num_of_lines -= reply; /* reset count */

}

if ( fputs( line, stdout ) == EOF ) /* show line */

exit(1); /* or die */

num_of_lines++; /* count it */

}

}

int see_more()

/*

* print message, wait for response, return # of lines to advance

* q means no, space means yes, CR means one line

*/

{

int c;

printf("\\033[7m more? \\033[m"); /* reverse on a vt100 */

while( (c=getchar()) != EOF ) /* get response */

{

if ( c == 'q' ) /* q -> N */

return 0;

if ( c == ' ' ) /* ' ' => next page */

return PAGELEN; /* how many to show */

if ( c == '\

' ) /* Enter key => 1 line */

return 1;

}

return 0;

}

==================================

* more02.c - version 0.2 of more

* read and print 24 lines then pause for a few special commands

* feature of version 0.2: reads from /dev/tty for commands

*/

#include

#define PAGELEN 24

#define LINELEN 512

void do_more(FILE *);

int see_more(FILE *);

int main( int ac , char *av[] )

{

FILE *fp;

if ( ac == 1 )

do_more( stdin );

else

while ( --ac )

if ( (fp = fopen( *++av , "r" )) != NULL )

{

do_more( fp ) ;

fclose( fp );

}

else

exit(1);

return 0;

}

void do_more( FILE *fp )

/*

* read PAGELEN lines, then call see_more() for further instructions

*/

{

char line[LINELEN];

int num_of_lines = 0;

int see_more(FILE *), reply;

FILE *fp_tty;

fp_tty = fopen( "/dev/tty", "r" ); /* NEW: cmd stream */

if ( fp_tty == NULL ) /* if open fails */

exit(1); /* no use in running */

while ( fgets( line, LINELEN, fp ) ){ /* more input */

if ( num_of_lines == PAGELEN ) { /* full screen? */

reply = see_more(fp_tty); /* NEW: pass FILE * */

if ( reply == 0 ) /* n: done */

break;

num_of_lines -= reply; /* reset count */

}

if ( fputs( line, stdout ) == EOF ) /* show line */

exit(1); /* or die */

num_of_lines++; /* count it */

}

}

printf("\\033[7m more? \\033[m"); /* reverse on a vt100 */

while( (c=getc(cmd)) != EOF ) /* NEW: reads from tty */

{

if ( c == 'q' ) /* q -> N */

return 0;

if ( c == ' ' ) /* ' ' => next page */

return PAGELEN; /* how many to show */

if ( c == '\

' ) /* Enter key => 1 line */

return 1;

}

return 0;

}

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值