LoveUnix » 编程开发 & Rational » 请高手帮帮忙,在此谢过!
让LU留住您的每

一天 让LU博客留住您的每一天
2006-7-19 15:30 lgy1727
请高手帮帮忙,在此谢过!

more02.c基础上实现如下修改
1、文本上滚时,反白的more?不要上滚。(可以使用ESC序列)
2、显示百分比
3、输入q或空格时不再要求回车。


/*  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        <stdlib.h>
#include        <stdio.h>

#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        */
        }
}

int see_more(FILE *cmd)                                   /* NEW: accepts arg  */
/*
*        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=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 == '\n' )                /* Enter key => 1 line        */
                        return 1;               
        }
        return 0;
}

2006-7-25 17:25 zhoulifa
这题我做过

去看我贴出来的源码在这里:[url]http://zhoulifa.bokee.com/5396159.html[/url]

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.