⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 more1.c

📁 自己实现的类似linux上more命令的代码
💻 C
字号:
#include<stdio.h>
#include<curses.h>
#include<unistd.h>
#define PAGELEN 24
#define LINELEN 512

void do_more(FILE *);
int see_more(FILE *);

int main(int ac,char *av[])
{
    FILE *fp;

    if(1==ac)
        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)
 {
    char line[LINELEN];
    int num_of_lines=0;
    int see_more(FILE *),reply;
    FILE *fp_tty;

    fp_tty=fopen("/dev/tty","r");
    if(fp_tty==NULL)
        exit(1);

     while(fgets(line,LINELEN,fp))
     {#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;
}

 

    int c;
    printf("\033[7m more? \033[m");
    while((c=getch())!=EOF)
    {
        if(c=='q')
            return (0);
        if(c==' ')
            return PAGELEN;
        if(c=='\n')
            return (1);
     }
     return (0);
  }


































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -