首页 > 系统相关 >Linux系统编程21-简单的more命令实现

Linux系统编程21-简单的more命令实现

时间:2023-06-27 15:24:40浏览次数:40  
标签:fp tty 读取 21 FILE Linux 输入 more

/dev/tty: 键盘和显示器设备描述文件

  • 向该文件写->显示在用户屏幕
  • 向该文件读->从键盘获取用户输入

当more需要用户输入可以从/dev/tty得到数据

#include <stdio.h>
#include <stdlib.h>

#define PAGELEN 24
#define LINELEN 512

void do_more(FILE*);
int see_more(FILE*);

/*
    main 函数根据命令行参数打开并读取文件,
    如果没有命令行参数则从标准输入读取。
    调用 do_more 函数来执行分页显示的操作。
*/
int main(int argc, char const *argv[])
{
    FILE* fp;
    if(argc == 1)
        do_more(stdin); // 没有参数时读取标准输入
    else
        while(--argc){
            // 逐个打开文件并读取
            if((fp = fopen(*++argv, "r")) != NULL){ 
                do_more(fp);
                fclose(fp);
            }else
                exit(1);
        }

    return 0;
}

/*
do_more 函数对于每个文件,从文件中读取内容并分页显示,
等待用户按下空格或回车以继续显示,或者按下 q 退出显示。
*/
void do_more(FILE* fp){
    char line[LINELEN];
    int num_of_lines = 0;   //已经显示的行数
    int see_more(FILE*), reply;
    FILE* fp_tty;   //指向 /dev/tty 设备文件的文件指针
    //该设备文件指向当前正在使用的终端设备,用来接收用户的输入。
    fp_tty = fopen("/dev/tty","r"); 

    if(fp_tty == NULL){
        exit(1);
    }

    while(fgets(line, LINELEN, fp)){
        //当显示行数达到 PAGELEN 定义的行数时就停止并调用 see_more 函数等待用户输入
        if(num_of_lines == PAGELEN){
            reply = see_more(fp_tty);
            if(reply == 0)
                break;
            //如果读取一页,num_of_lines又变成0了,新的一页开始
			//如果读取一行,则下次循环又满足 num_of_lines == PAGELEN 条件 ,继续输入指令
            num_of_lines -= reply;  //reset count
        }

        if(fputs(line, stdout) == EOF)
            exit(1);
        num_of_lines++;
    }
}

//q-退出,空格翻页,回车显示一行
int see_more(FILE* cmd){
    int c;
	// \033[7m 是设置反显(即黑底白字)的控制码,\033[m 则是关闭反显的控制码
    printf("\033[7m more? \033[m");
    //使用 getc 函数从 fp_tty 文件指针中获取用户的输入。
    while((c=getc(cmd)) != EOF){
        //按下 q 时,退出函数并返回 0,表示不再显示更多内容。
        if(c=='q')
            return 0;
        //按下空格时,返回 PAGELEN 定义的行数,表示继续显示下一页。
        if(c==' ')
            return PAGELEN;
        //按下回车时,返回 1,表示只显示下一行内容。
        if(c=='\n')
            return 1;
    }
    return 0;
}

getc 和 getchar 有什么区别
相同:都是 C 语言中用于从输入流中读取一个字符的函数

不同:

  • getchar 从标准输入流(通常是键盘)中读取一个字符。
    它是 C 标准库中的函数,可以不传递参数,也可以传递参数 stdin,
    表示从标准输入流中读取一个字符。
  • getc 也可以从标准输入流中读取一个字符,但它还可以从其他流中读取一个字符。
    它需要传递一个 FILE 类型的指针参数,表示从哪个流中读取一个字符。

标签:fp,tty,读取,21,FILE,Linux,输入,more
From: https://www.cnblogs.com/anqwjoe/p/17508951.html

相关文章

  • windows和linux环境下安装jprofiler
    Windows安装jprofiler一.windows安装和激活1.首页默认,直点击下一步2.同意授权3.进入注册页面4.在注册页面输入用户和密钥5.打开注册机,点击generate生成账号和密钥6.把licensekey输入到步骤一中的密钥框,公司名字可以顺便写7.直接点击下一步,完成安装二.Linux安装1.......
  • 初识Quantum Mini Linux Development Kit
    本人近期看到稚晖君的Linux-card的相关视频介绍,看到它极大的方便,整体只需Type-C即可供电并且算力满足目前所需要求功能也不少。于是火速下单,从SpeedStudio购入。到货后先认识这个开发套件的外观,可以说是非常小巧,功能接口也不少,可以满足大部分需求。      ......
  • linux vim常用快捷键
    linuxvim常用快捷键行尾插入:A行首插入:I光标后插入:a光标前插入:i往下插入空行:o往上插入空行:O定位整个文本第一行:gg定位整个文本最后一行:G定位某行:比如定位21行::21或21gg或21G复制整行:yy粘贴:p往下复制3行:3yy复制单个字符:v模式——y复制——p粘贴删除整行:dd往下删......
  • 统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序
    前言  在ubuntu上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序。<br>注意  本篇文章,最终手动结合几个方式成功,花费不少时间研究,推断是终端直......
  • Linux安装花生壳进行端口映射内网穿透
    1下载1.1官网下载进入 花生壳 官网,选择linux版安装包,下载,上传到服务器 1.2wget下载wget"https://down.oray.com/hsk/linux/phddns_5.2.0_amd64.rpm"-Ophddns_5.2.0_amd64.rpm 2安装执行命令rpm-ivhphddns_5.2.0_amd64.rpm安装成功......
  • cad2021中文版下载_cad2021简体中文版下载「附安装教程」分享
    cad2016官方版是一款专业且功能多样的图纸绘制工具。AutoCAD2016中文版优化了硬件加速效果,使其更加的无论平滑和流畅,能够用于二维绘图、详细绘制、设计文档和基本三维设计。AutoCAD2016软件全方位的更新了Dim命令,同时对图层进行了人性化的改进,操作更加方便。cad2016官方版软件介绍A......
  • Linux扩展篇-shell编程(五)-流程控制(二)-case语句
    基本语法:case"${item}"in1)echo"item=1";;2|3)echo"item=2oritem=3";;*)echo"default(noneofabove)";;esac注意事项:以case开始esac结尾case行尾必须为单词“in”,每......
  • 24W机壳式AC-DC降压开关电源模块AP21-24W24N产品简介
    输入电压:100~250V输出电压:24V输出电流:1000mA输出功率:24W产品尺寸:85*58*33mm安装方式:螺丝固定功能特点:高精度工业电源产品简介:AP21-24W24N是一款小体积机壳式开关电源,交流直流两用,输入电压85~264Vac/100~370Vdc,超低纹波、超低功耗、高效率、安全隔离、高可靠性等优点;符合IEC60950......
  • linux内核常用调优参数
    linux内核常用调优参数1.vm.swappiness:该参数控制系统在内存不足时,内核将页面交换到磁盘的程度。默认值为60,建议值为10-30。2.vm.overcommit_memory:该参数控制系统是否允许超额分配内存。默认值为0,建议值为1。3.vm.dirty_ratio:该参数控制系统脏页占内存的比例。默认值为20,建议......
  • Linux扩展篇-shell编程(五)-流程控制(一)-if语句
    基本语法:(1)单分支if[condition];then#ifbodyfi或if[condition]then#ifbodyfi(2)多分支if[condition];then#ifbodyelif[condition];then#elseifbodyelse#elsebodyfi注意事项:以if开始fi结尾,当then和if在同一......