1. more第一版

实现基础功能,显示每一页固定24行文本,“q Enter”退出, “Enter” 下一行, “space Enter”下一页。

#include<stdio.h>
#include<stdlib.h>
#define PAGELEN 5
#define LINELEN 512//实现基础功能,显示每一页固定24行文本,“q Enter”退出, “Enter” 下一行, “space Enter”下一页。
void do_more(FILE *);
int see_more();int main (int ac, char *av[])
{    FILE *fp;if ( ac == 1)do_more(stdin); //如果没有第2个参数 从标准输入获取内容else {while(--ac){//* ++av 命令行第二个参数(文件名)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){ //最多显示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;//白底黑字 \033[7m str \033[mprintf("\033[7m more? \033[m");while( (c = getchar()) != EOF){if ( c == 'q')return 0;else if ( c == ' ')return PAGELEN; //空格返回PAGELEN行else if ( c == '\n' )  return 1;  //回车 只返回一行
    }return 0;}

2.more第二版

解决上一个版本“ls -l /etc |  ./more01”, “ls -l /etc” 输出重定向为“./more01”  输入时 由于see_more() 函数中getchar()与do_more(FILE *fp)中读取都是stdin中的数据,时输出一页后不回暂停等待命令。

解决方法是: see_more()改为通过/dev/tty(键盘与显示设备的描述文件),读取键。
#include <stdio.h>
#include <stdlib.h>#define PAGELEN 5
#define LINELEN 512void 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[1],"r")) != NULL ){do_more(fp);fclose(fp);} else{exit(1);} }}return 0;}void do_more(FILE *fp)
{char line[LINELEN];int reply;int number_line = 0;FILE *fp_tty;fp_tty = fopen("/dev/tty","r"); // 打开/dev/tty设备文件 键盘与显示设备的描述文件),读取键if(fp_tty == NULL)  exit(1);  while(fgets(line, LINELEN, fp) != NULL)  {  if(number_line == PAGELEN)  {  reply = see_more(fp_tty);  if(reply == 0)   break;  number_line -= reply;  }  if( fputs(line, stdout) == EOF)  exit(1);  number_line ++;  }
}int see_more(FILE *cmd)
{  int c;  printf("\033[7m more? \033[m");  while( (c = getc(cmd)) != EOF ) //此处的getchar()从stdin读取数据,getc(cmd)从文件cmd(/dev/tty)中读入数据
    {  if(c == 'q')  return 0;  if(c == ' ')  return PAGELEN;  if(c == '\n')  return 1;  }  return 0;
}  

转载于:https://www.cnblogs.com/loveyouyou616/p/7773026.html

Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)相关推荐

  1. Linux下dislocate命令用法,五个超酷Linux命令

    1.kibitz:交互对话-屏幕同时显示(师徒对话)(要求安装expect工具) kibitz是一个终端工具,它主要用于让一个"师父(master)"来帮助他/她的"徒弟 ...

  2. windows测试linux带宽,linux下使用命令行测试网速 speedtest-cli,Linux带宽测试

    Speedtest.net提供了一个命令行工具 speedtest-cli 我们可以在Linux中使用speedtest-cli来测试宽带速度 speedtest-cli是由Python编写的轻量级L ...

  3. linux下modprobe命令参数及用法详解--linux加载模块命令

    modprobe(module probe) 功能说明:自动处理可载入模块. 语 法:modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值] 补充说明:modpr ...

  4. Linux 下 TC 命令原理及详解<一>

    文章目录 1 前言 2 相关概念 3 使用TC 4 创建HTB队列 5 为根队列创建相应的类别 6 为各个类别设置过滤器 7 复杂的实例 Linux 下 TC 命令原理及详解<一> Lin ...

  5. linux 下搜索的命令,Linux下搜索命令

    linux下用于查找文件的5个命令,有需要的朋友可以参考下.包括find,whereis,locate,which与type. linux下用于查找文件的5个命令,有需要的朋友可以参考下. 包括fin ...

  6. Linux高频命令汇总,Linux下高频命令分类辑录(基本使用篇)

    本文目的:总结linux下常用命令的基本使用方法 文件权限: 文档权限设置命令:chmod 数字模式: 文档权限由-rwxrwxrwx十个字符组成,其中第一个代表文档类型,后面九个字符按照顺序分为三组 ...

  7. linux中which命令详解,Linux下which命令使用详解(转)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...

  8. Linux下copy命令,并重命名

    Linux下copy命令,并重命名覆盖目标文件 LINUX下help copy用法 LINUX下help 对于英语很6的读者,可以阅读下文 注:引用自Linux帮助文档 Usage: cp [OPTI ...

  9. linux命令查找关键字前五行,linux下grep命令实现查找多个关键字(与关系和或关系)...

    grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用 ...

最新文章

  1. 【通俗理解线性代数】 -- 内积与相关
  2. linux 命令输出保存为文件的三种方式
  3. 黄山学院计算机课,黄山学院非计算机类专业计算机课程教学管理规定
  4. ngx_conf_s
  5. SocketServer源码学习(二)
  6. C#设计模式之2-抽象工厂模式
  7. html文件变成巨大,巨大的JavaScript HTML5 blob(从大ArrayBuffers)在客户端构建一个巨大的文件...
  8. 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
  9. jdk1.8下载与安装教程
  10. BP神经网络及其设计的一般原则
  11. 汇编语言Loop指令
  12. 新sniffer pro 4.75 sp5下载
  13. 4.各种动物英语表示
  14. Java将图片压缩为原来的一半
  15. 6-1 求实数和的函数
  16. oracle上机题库_Oracle笔试题库附参考答案
  17. STM32系统时钟详解
  18. 陕西省计算机大赛,陕西省青少年信息学(计算机)奥林匹克竞赛委员会文件.doc
  19. 打印html所有标签,js 打印标签里的所有内容(带分页)
  20. 多元函数第六:连续函数(6)Bolzano-Weierstrass 波尔查诺-维尔斯特拉斯定理 聚点与列紧集

热门文章

  1. 嵌入式Linux入门13:应用层调试
  2. maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
  3. iis8.5限速没有效果怎么回事_电梯为何会发生坠梯?没有安全措施吗?能在井道底安装大弹簧吗?...
  4. 【flink】flink 消费组死掉 Lag不变 kafka不提交 重启恢复 非常诡异
  5. 【Flink】FLink 写入kafka 中关于 Exactly-Once 的一些思考
  6. 【Flink】使用Flink实现索引数据到Elasticsearch
  7. 【前端】VUE UI的安装
  8. 95-40-032-java.util.concurrent-ConcurrentHashMap
  9. 【Mac】一些软件的图片和视频位置 QQ 微信
  10. 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)