Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)
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中的数据,时输出一页后不回暂停等待命令。
#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编程实践教程)相关推荐
- Linux下dislocate命令用法,五个超酷Linux命令
1.kibitz:交互对话-屏幕同时显示(师徒对话)(要求安装expect工具) kibitz是一个终端工具,它主要用于让一个"师父(master)"来帮助他/她的"徒弟 ...
- windows测试linux带宽,linux下使用命令行测试网速 speedtest-cli,Linux带宽测试
Speedtest.net提供了一个命令行工具 speedtest-cli 我们可以在Linux中使用speedtest-cli来测试宽带速度 speedtest-cli是由Python编写的轻量级L ...
- linux下modprobe命令参数及用法详解--linux加载模块命令
modprobe(module probe) 功能说明:自动处理可载入模块. 语 法:modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值] 补充说明:modpr ...
- Linux 下 TC 命令原理及详解<一>
文章目录 1 前言 2 相关概念 3 使用TC 4 创建HTB队列 5 为根队列创建相应的类别 6 为各个类别设置过滤器 7 复杂的实例 Linux 下 TC 命令原理及详解<一> Lin ...
- linux 下搜索的命令,Linux下搜索命令
linux下用于查找文件的5个命令,有需要的朋友可以参考下.包括find,whereis,locate,which与type. linux下用于查找文件的5个命令,有需要的朋友可以参考下. 包括fin ...
- Linux高频命令汇总,Linux下高频命令分类辑录(基本使用篇)
本文目的:总结linux下常用命令的基本使用方法 文件权限: 文档权限设置命令:chmod 数字模式: 文档权限由-rwxrwxrwx十个字符组成,其中第一个代表文档类型,后面九个字符按照顺序分为三组 ...
- linux中which命令详解,Linux下which命令使用详解(转)
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...
- Linux下copy命令,并重命名
Linux下copy命令,并重命名覆盖目标文件 LINUX下help copy用法 LINUX下help 对于英语很6的读者,可以阅读下文 注:引用自Linux帮助文档 Usage: cp [OPTI ...
- linux命令查找关键字前五行,linux下grep命令实现查找多个关键字(与关系和或关系)...
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用 ...
最新文章
- 【通俗理解线性代数】 -- 内积与相关
- linux 命令输出保存为文件的三种方式
- 黄山学院计算机课,黄山学院非计算机类专业计算机课程教学管理规定
- ngx_conf_s
- SocketServer源码学习(二)
- C#设计模式之2-抽象工厂模式
- html文件变成巨大,巨大的JavaScript HTML5 blob(从大ArrayBuffers)在客户端构建一个巨大的文件...
- 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
- jdk1.8下载与安装教程
- BP神经网络及其设计的一般原则
- 汇编语言Loop指令
- 新sniffer pro 4.75 sp5下载
- 4.各种动物英语表示
- Java将图片压缩为原来的一半
- 6-1 求实数和的函数
- oracle上机题库_Oracle笔试题库附参考答案
- STM32系统时钟详解
- 陕西省计算机大赛,陕西省青少年信息学(计算机)奥林匹克竞赛委员会文件.doc
- 打印html所有标签,js 打印标签里的所有内容(带分页)
- 多元函数第六:连续函数(6)Bolzano-Weierstrass 波尔查诺-维尔斯特拉斯定理 聚点与列紧集
热门文章
- 嵌入式Linux入门13:应用层调试
- maven中引入oracle驱动报错Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
- iis8.5限速没有效果怎么回事_电梯为何会发生坠梯?没有安全措施吗?能在井道底安装大弹簧吗?...
- 【flink】flink 消费组死掉 Lag不变 kafka不提交 重启恢复 非常诡异
- 【Flink】FLink 写入kafka 中关于 Exactly-Once 的一些思考
- 【Flink】使用Flink实现索引数据到Elasticsearch
- 【前端】VUE UI的安装
- 95-40-032-java.util.concurrent-ConcurrentHashMap
- 【Mac】一些软件的图片和视频位置 QQ 微信
- 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)