linux文件管理小结之自己定义more

1.more命令功能

more命令用于查看内容超过一屏的文本(相似于cat)

基本功能

1.输入backspace :内容翻一屏

2.输入enter : 内容翻一行

3.输入q:退出

4.实时显示已读文件比例

2.实现思路

  1. 从命令中获取须要操作的文件
  2. 打开文件:open(filename,O_RDONLY);
  3. 获取文件总行数:

    lseek(fd,0,SEEK_END);//移动文件指针至文件末

    page_sum = lseek(fd,0,SEEK_CUR);//计算与文件头偏移量。就可以得到文件总行数

  4. 命令初始读取内容(定义整屏为10行)

    设置一标志量 存储 每次须要显示的行数,如果n。则运行n次下操作

    用read(fd,str,1); 每次读取一个字节,读到’\n’停止

    而且在每次读完之后须要用lseek(fd,0,SEEK_CUR)来获取当前已显示行数。用于得到文件已阅比例

  5. 每次操作完毕后接受用户指令

    see_more();

    函数接受用户输入,依据输入值返回要翻的页数

  6. close(fd);

过程收获

  1. 反显文字:

    做这个时才了解到linux 上 printf的功能好丰富,清屏。移动光标,一应俱全。

  2. 保证more的提示信息总显示在终端的最下端。并不反复显示

    刚開始准备使用,printf(“\033[s”)记录光标位置。输出后,再用printf(“\033[u\033[K”);光标归位并清行;

    然而在输出提示信息中。还须要接受用户的输入,会产生换行符,而换行之后,光标归位会失效,记录于此。

    终于是用printf(“\033[1A\033[K”)将光标上移一行,并清空该行内容,用以覆盖提示信息

  3. 文件比例的实现

    这个的实现细节上文已经提到,之所以再做赘述,是由于笔者在实现过程中由于此功能卡顿非常久

    由于须要按行读的缘故,想要使用fgets()来读取文本。可是打开文件又用的是系统函数open(),而非fopen(),于是就产生了混用的情况。

    而结果是每次用lseek()读取当前文件指针偏移量时,得到的值都是文件首与文件尾的偏移量,改为fseek()后,值变为0,探究无果,不知其因,记录于此,日后再谈

代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#define PAGENUM 10 //定义一屏为10行

void do_more(int fd);
int see_more(  int sum, int now);

int main( int argc, char **argv )
{
    int fd;
    if( argc == 1 )//參数不合法则返回
    {
        return 0;
    }
    else
    {
        while( argc-->1 )
        {
            if( (fd = open(*++argv,O_RDONLY)) != -1 )
            {
                do_more(fd);
                close(fd);
            }
            else
            {
                printf("Error: can‘t open file\n");
                exit(1);
            }
        }
    }
    return 0;
}

void do_more(int fd)
{
    char str[3];
    int page_num = 0;//保存每次须要跳转的行数
    int rel;
    int page_now = 0;//保存当前行数(初始为0)
    int page_sum;//保存总行数

    lseek(fd,0,SEEK_END);//移动文件指针至文件末
    page_sum = lseek(fd,0,SEEK_CUR);//计算与文件头偏移量,即文件总行数
    lseek(fd,0,SEEK_SET);//移动文件指针至文件头

    while( page_now<page_sum )
    {
        while(read(fd,str,1))//每次读一行
        {
            if(str[0] ==‘\n‘)
            {
                printf("\n");
                break;
            }
            printf("%c",str[0]);
        }
        page_now = lseek(fd, 0, SEEK_CUR);//实时更新已读行数
        if( page_num == PAGENUM )
        {
            rel = see_more( page_sum, page_now);//获取用户输入
            printf("\033[1A\033[K");//将光标上移一行,并清空该行内容,用以覆盖提示信息
            if( rel == 0 )
            {
                break;
            }
            else
            {
                page_num -= rel;
            }
        }
        page_num++;
    }
}

int see_more(int sum,int now)
{
    int rel;
    printf("\033[7m --很多其它-- enter翻行 backspace翻页 q退出  %.2f%% \033[0m",now*100.0/sum);//反显输出提示信息以及文件已读比例

    while(rel = getchar())
    {
        if(rel == ‘q‘)
        {
            return 0;
        }
        if(rel == ‘ ‘)
        {
            return PAGENUM;
        }
        if(rel == ‘\n‘)
        {
            return 1;
        }
    }

    return 0;
}
时间: 2024-10-01 08:00:54

linux文件管理小结之自己定义more的相关文章

linux文件管理小结之自定义more

1.more命令功能 more命令用于查看内容超过一屏的文本(类似于cat) 基本功能: 1.输入backspace :内容翻一屏 2.输入enter : 内容翻一行 3.输入q:退出 4.实时显示已读文件比例 2.实现思路 从命令中获取需要操作的文件 打开文件:open(filename,O_RDONLY); 获取文件总行数: lseek(fd,0,SEEK_END);//移动文件指针至文件末 page_sum = lseek(fd,0,SEEK_CUR);//计算与文件头偏移量,即可得到文件

linux文件管理类命令汇总及通配的几个事例

linux文件管理类命令汇总 1.文本文件查看类命令:cat,tac,more,less,tail,head cat(tac): 正向(反向)显示 cat [OPTION]... [FILE]...                -E:显示行结束符$ -n:对显示出的每一行进行编号 more [OPTIONS...] FILE... 特点:翻屏至文件尾部后自动退出; -d:显示翻页及退出提示 space:向下翻页                        Enter:向下翻一行 b,ctrl

Linux用户管理(三)Linux文件管理

Linux文件管理 一.文件系统及Shell的基本概念 1.文件系统的含义 文件系统是用来管理和组织保存在磁盘驱动器上数据的系统软件 2.Linux的文件系统 Linux系统采用虚拟文件系统技术(VFS).结构采用倒立树型.VFS使Linux支持以下文件系统: EXT2:                       二次扩展 EXT3:                       三次扩展 SWAP:                       交换文件系统 FAT.FAT32 NTFS    

初识linux文件管理

初识linux文件管理 1.文件系统与目录结构 文件系统从根目录 下开始,用"/". 以. 开头的文件为隐藏文件,路径分隔用/表示.文件系统的层级结构是LSB(linux standard base),遵循文件系统层级标准(FHS ) 文件命名规则:   文件名最长255个字节,包括路径名在内共4095个字节 蓝色–> 目录 绿色–> 可执行文件 红色–> 压缩文件 浅蓝色–> 链接文件 灰色–> 除了斜杠和NUL, 所有字符都有效,但不推荐使用特殊字符,

Linux文件管理命令

Linux文件管理命令 Linux目录与路径 cd:切换目录 例如:cd ~willhua,则回到用户willhua的主文件夹  cd ~或者cd,则表示回到自己的的主文件夹  cd -,则表示回到上个目录 pwd:显示目前所在目录 参数: -p,显示当前路径,而非使用连接路径 mkdir:新建新目录 参数: -m:直接配置文件的权限,而不管默认权限umask,比如mkdir -m 711 test1,则test1的权限为711 -p:帮助你直接将所需要的目录递归创建起来,比如mkdir -p

linux 文件管理命令cp, mv, rm

linux文件管理 cp, mv, rm 复制命令: cp cp [Option] ... [-T] SRC(源) DEST(目的) (如果目标不存在,则新建DEST, 并将SRC中的内容填充至DEST中. 如果目标存在:如果DEST是文件,将SRC内容覆盖至DEST中. 此时建议为cp命令使用-i选项. 如果DEST是目录,在DEST下新建与原文件同名的文件,并将SRC中内容填充至DEST中) 实例:cp /etc/fstab /tmp/out.tmp    (out.tmp为文件) cp /

Linux学习笔记--Linux文件管理类名利详解

Linux文件管理类命令详解 目录管理: ls.cd.pwd.mkdir.rmdir.tree 文件管理: touch.stat.file.rm.cp.mv.nano 日期管理: touch.clock.hwclock.cal 查看文本: cat.tac.more.less.head.tail cat:连接并显示 -n:在显示时显示每一行的行号 -E:在每行结束处显示 $ Ctrl+C:结束命令 分屏显示: more.less more:向后翻 less: q退出命令 head:查看前n行 ta

Linux文件管理相关命令

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux文件管理背景知识之后, 我们可以学习一些命令来管理我们的文件. 文件操作相关 有一些命令可以帮助我们"修剪"之前看到的文件树. $touch a.txt 如果a.txt不存在,生成一个新的空文档a.txt.如果a.txt存在,那么只更改该文档的时间信息.(这个命令实际上用得并不广泛,但可以帮我们创建一个空文件来实验下面操作) $ls . 是list的简

Linux内核导出符号宏定义EXPORT_SYMBOL的源码分析

源代码: <include/linux/moudule.h> --. #ifndef MODULE_SYMBOL_PREFIX #define MODULE_SYMBOL_PREFIX "" #endif --. struct kernel_symbol       //内核符号结构 { unsignedlong value;  //该符号在内存地址中的地址 constchar *name;     //该符号的名称 }; -- #define __EXPORT_SYMBO