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 == )
do_more(stdin); //如果没有第2个参数 从标准输入获取内容
else
{
while(--ac){
//* ++av 命令行第二个参数(文件名)
if ( (fp = fopen(* ++av, "r")) != NULL ){ //打开文件
do_more(fp);
fclose(fp);
} else {
exit();
}
}
}
return ; } void do_more(FILE *fp)
{
//定义变量
char line[LINELEN];
int num_of_lines = ;
int see_more(),reply; while (fgets(line,LINELEN,fp)){ if (num_of_lines == PAGELEN){ //最多显示PAGELEN行
reply = see_more(); if (reply == )
break; num_of_lines -= reply;
} //标准输出
if (fputs(line,stdout) == EOF){
exit();
}
num_of_lines++;
}
} int see_more()
{
int c;
//白底黑字 \033[7m str \033[m
printf("\033[7m more? \033[m");
while( (c = getchar()) != EOF)
{
if ( c == 'q')
return ;
else if ( c == ' ')
return PAGELEN; //空格返回PAGELEN行
else if ( c == '\n' )
return ; //回车 只返回一行
} return ; }
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 512 void do_more(FILE *);
int see_more(FILE *); int main (int ac, char *av[])
{
FILE *fp;
if (ac == )
do_more(stdin);
else
{
while(--ac)
{
if ((fp = fopen(av[],"r")) != NULL )
{
do_more(fp);
fclose(fp);
}
else
{
exit();
} }
}
return ; } void do_more(FILE *fp)
{
char line[LINELEN];
int reply;
int number_line = ;
FILE *fp_tty; fp_tty = fopen("/dev/tty","r"); // 打开/dev/tty设备文件 键盘与显示设备的描述文件),读取键 if(fp_tty == NULL)
exit(); while(fgets(line, LINELEN, fp) != NULL)
{
if(number_line == PAGELEN)
{
reply = see_more(fp_tty);
if(reply == )
break;
number_line -= reply;
}
if( fputs(line, stdout) == EOF)
exit();
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 ;
if(c == ' ')
return PAGELEN;
if(c == '\n')
return ;
}
return ;
}
Linux下more命令C语言实现实践 (Unix-Linux编程实践教程)的更多相关文章
- Linux下who命令之C语言实现
Linux下who命令之C语言实现 Step1:前期准备 首先要有一个清楚的认识:linux中一切皆文件 实现who命令,who命令也是Linux中的一个文件,那我们怎么找到它呢?我们可以" ...
- 20155212 C语言实现linux下pwd命令的两种方法
20155212 C语言实现linux下pwd命令的两种方法 学习pwd命令 通过man pwd命令查看 pwd [OPTION],一般不加参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 ...
- Linux下ls命令显示符号链接权限为777的探索
Linux下ls命令显示符号链接权限为777的探索 --深入ls.链接.文件系统与权限 一.摘要 ls是Linux和Unix下最常使用的命令之一,主要用来列举目录下的文件信息,-l参数允许查看当前目录 ...
- linux下的命令是如何运行的
linux下的命令分为内建命令.可执行文件.脚本文件 shell终端里键入一个命令,如ls.cd.bash,shell会先查询一个环境变量PATH,它存了各种可执行文件的路径,输入$PATH可以打印变 ...
- Linux下ps命令详解 Linux下ps命令的详细使用方法
http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...
- 例解 Linux 下 Make 命令
Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一.管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题.本文我们将用一些实例来讨论 make ...
- linux下history命令显示历史指令记录的使用方法
Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中.默认保存1000条,你也可以更改这个值 ...
- linux下svn命令使用大全
最近经常使用svn进行代码管理,这些命令老是记不住,得经常上网查,终于找了一个linux下svn命令使用大全:1.将文件checkout到本地目录 svn checkout path(path是服务器 ...
- Linux下rz命令使用的实例详解
Linux中rz命令和sz命令都可用于文件传输,而rz命令主要用于文件的上传,下面将通过几个实例来给大家详细介绍下Linux下rz命令的用法,一起来学习下吧. rz命令可以批量上传文件,当然也可上传单 ...
随机推荐
- 尚硅谷redis学习1-NOSQL简介
本系列是自己学习尚硅谷redis视频的记录,防止遗忘,供以后用到时快速回忆起来,照抄视频和资料而已,没什么技术含量,仅给自己入门了解,我是对着视频看一遍再写的,视频地址如下:尚硅谷Redis视频 背景 ...
- delphi异常捕获try except语句 和 try finally语句用法
原文地址:delphi try except语句 和 try finally语句用法以及区别作者:1865898133 一直写程序都没管他们,也尽量很少用,今天终于想把他给弄个明白,在网上找来,记下! ...
- java后端实习生面试题目
1.编程题:java从10000到99999找到AABB类型 public class Test1 { public static void main(String[] args) { String ...
- linux 3.10 tcp的accept测试
net.ipv4.tcp_abort_on_overflow 为 0 有个兄弟跟我说accept的时候,如果故意不去accept,那么客户端connect的时候,一开始很快,后来就很慢: connec ...
- Windows查看指定端口是否占用和查看进程
Winodows上查看指定端口号的使用情况和占用进程以及终止所占用端口进程进程用到.下面主要描述如何操作. 1.查看所有端口占用情况 C:\Users\Administrator>netstat ...
- [Linux].deb软件包:wine-qq2013-longeneteam安装与卸载
--------------------------------------------------------------------------------------------- 首先切换到r ...
- 移动端取消touch高亮效果
在做移动端页面时,会发现所有a标签在触发点击时或者所有设置了伪类 :active 的元素,默认都会在激活状态时,显示高亮框,如果不想要这个高亮,那么你可以通过css以下方法来禁止: .xxx{ -we ...
- sp_executesql 或者 EXECUTE 执行动态sql的权限问题
当 sp_executesql 或 EXECUTE 语句执行字符串时,字符串将作为它的自包含批处理执行.SQL Server 会将字符串中的一个或多个 Transact-SQL 语句编译为独立于批处理 ...
- python pip 下载慢 配置使用国内源配置
ubuntu apt 使用国内源 设置>软件和更新>下载自 选择mirrors.aliyun.com/ubuntu 更新源sudo apt-get update 安装系统包:sudo ap ...
- Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)
1.configuration(配置信息管理,产生sessionfactory) sessionfactory管理一系列的连接池 opensession 永远打开新的,需要手动close getcur ...