linux more 命令的基础实现。

more :分页显示文件的内容

输入 more filename  

会显示文件第一屏的内容,而且会有反白的 more 提升文件的百分比。空格=下一页,q=推出,h=连接帮助

more 的用法

1. more filename 如 :more filename.c

2. comand | more  如:ls -al / | more

3.more < filename 如:more < 1.txt

/* moreo1.c version 0.1 of more
* read and print 24 line then pause for a few special commands
*/

#include <stdio.h>
#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)
{
  char line[LINELEN];
  int num_of_lines = 0;
  int see_more(),reply;
  while( fgets(line, LINELEN, fp)){
    if(num_of_lines == PAGELEN){
      reply=see_more();
      if(reply == 0)
        break;
      num_of_lines -=reply;
    }
    if (fputs(line, stdout) == EOF)
      exit(1);
    num_of_lines++;
  }
}

 

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

 

 ////改进的more命令

/* moreo2.c version 0.1 of more
* read and print 24 line then pause for a few special commands
*/

#include <stdio.h>
#include <stdlib.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)
{
  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)){
    if(num_of_lines == PAGELEN){
      reply=see_more(fp_tty);
      if(reply == 0)
        break;
     num_of_lines -=reply;
    }
    if (fputs(line, stdout) == EOF)
      exit(1);
    num_of_lines++;
  }
}


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

 

posted @ 2021-12-18 17:52  愿得入睡  阅读(85)  评论(0)    收藏  举报