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;
}

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

  1. 3-2 LInux文件管理

    LInux文件管理 文件系统目录结构 Linux中目录结构是有一定的约定的FHS /bin:存放二进制程序 /boot:启动相关 /dev:设备文件 /etc:配置文件 /home:用户家目录 /li ...

  2. Linux文件管理相关命令

    Linux文件管理相关命令   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux文件管理背景知识之后, 我们可以 ...

  3. 常用Linux命令小结

    常用Linux命令小结 Linux下有很多常用的很有用的命令,这种命令用的多了就熟了,对于我来说,如果长时间没有用的话,就容易忘记.当然,可以到时候用man命令查看帮助,但是,到时候查找的话未免有些临 ...

  4. Linux文件管理上

    Linux文件管理   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 对于计算机来说,所谓的数据就是0和1的序列.这样的一个序列 ...

  5. 看Linux 之父是如何定义 Linux?

    看Linux 之父是如何定义 Linux? LINUX是什么? LINUX是一个免费类unix内核,适用于386-AT计算机,附带完整源代码.主要让黑客.计算机科学学生使用,学习和享受.它大部分用C编 ...

  6. Linux下,根据FHS定义出来的每个目录的作用

    (下表摘自<鸟哥的Linux的私房菜>) 在Linux下,根据FHS定义出来的每个目录应该放置的档案内容为: 目录 应放置档案内容 / 根目录 root (/),一般建议在根目录底下只接目 ...

  7. Linux文件管理和编辑常用命令

    Linux文件管理和编辑常用命令 mkdir 命令 功能说明 mkdir 命令用于创建一个目录,mkdir是make directory的缩写 格式: mkdir [选项] 目录名 mkdir 命令的 ...

  8. 转 Linux文件管理

    Linux文件管理 http://www.cnblogs.com/vamei/archive/2012/09/09/2676792.html 作者:Vamei 出处:http://www.cnblog ...

  9. linux文件管理--压缩打包

    目录 linux文件管理--压缩打包 1.压缩打包介绍 2.gzip压缩工具 3.zip压缩工具 注意: 4.tar压缩工具 5.tar生产案例实践 linux文件管理--压缩打包 1.压缩打包介绍 ...

随机推荐

  1. React项目编译node内存溢出

    坑爹的node 内存溢出 react开发项目  安装一个插件依赖 ,然后就报错了 报错如下(自己的没有截图出来 这是从别人的截图---报错基本差不多) 之前因为项目大而且旧的原因  使用 过      ...

  2. C#解决关闭多线程的form主窗体时抛出ObjectDisposedException 异常

    一.现象: 我在主窗体新建线程,使用子线程来处理接收到的数据,并且更新窗体显示内容,但关闭主窗体程序之后就程序就报错,如下所示: 二.分析问题: 由于新建线程的处理函数里边是一直死循环处理数据,虽然窗 ...

  3. 【Codeforces Round #451 (Div. 2) C】Phone Numbers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map<string,vector > dic;模拟就好. 后缀.翻转一下就变成前缀了. 两重循环剔除这种情况不输出就 ...

  4. Talk the Talk

     Talk the Talk Mark Richards in Any pRoFESSion, jargon is used so that individuals within that pro- ...

  5. 【习题 6-4 UVA-439】Knight Moves

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] bfs模板题 [代码] /* 1.Shoud it use long long ? 2.Have you ever test sev ...

  6. WebService学习总结(2)——WebService是什么?

    一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...

  7. crm翻译导航栏

    在crm里面怎样翻译导航栏? 过程例如以下: 1 先新建一个解决方式.把网站地图加进去 2: 然后把这个解决方式到出来来,解压文件: 3:编辑第二个文件: watermark/2/text/aHR0c ...

  8. [转]C#连接操作mysql实例

    本文转自:http://hi.baidu.com/zhqngweng/item/c4d2520cb7216877bfe97edf 第三方组件:Mysql.Data.dll说明:去官方网站下载Mysql ...

  9. Node.js自学笔记之回调函数

    写在前面:如果你是一个前端程序员,你不懂得像PHP.Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择.这段时间对node.js进行了简单的学习,在这里 ...

  10. Apache的.htaccess项目根文件夹伪静态设置规则

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...