📄 more1.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 + -