一起talk C栗子吧(第一百九十二回:C语言实例--DIY less命令一 )


各位看官们,大家好,上一回中咱们说的是文件定位的例子,这一回咱们说的例子是:DIY less命令。闲话休提,言归正转。让我们一起talk C栗子吧!


看官们,我们在前面的章回中介绍过DIY shell的例子(点击这里查看第七十一回的内容),在该例子中我们DIY了几个Linux命令,比如常用的cd和ls命令。今天我们DIY的less命令也是一种常用的Linux命令,因此,可以把它作是DIY shell的一部分。

我们介绍一下DIY less命令的整体思路
首先是打开命令中指定的文件,然后依次读取文件中的内容并且显示出来,如果用户输入了命令,less会对命令进行响应。“就这么简单?”,这时有看官提问了,看官莫急,我刚才介绍的只是一个整体的框架,我们会以这个框架上添砖加瓦,至于添什么砖加什么瓦,请看下面详细的介绍:

1.打开文件

我们使用fopen函数来打开文件,关于fopen函数的使用方法,我们已经介绍过。我们的难点是打开文件时使用的文件名,因此我们需要从用户输入的命令中(位于DIY shell中)提取文件名。因为输入的命令是字符串形式,所以提取文件名可以看作是从字符串中提取有用的内容,这个有用的内容就是我们的文件名。我们使用的提取方法是”首尾法“。这是我自创的一种方法,当然了,大家不要看到自创是觉得很牛X,我在这里的自创比黄老邪在桃花岛自创弹指神功中的自创要弱一些。

感觉”首尾法“与弹指神功也是风马牛不相及的东西。哈哈扯远了,我们还是看一下”首尾法“吧。它是利用Linux命令格式来进行的,我们先看看less命令的格式:

less file_name

首尾法中所谓的首就是空格,尾就是一个换行符(我们读取命令时读取到了一个换行符)。大家结合命令格式就会发现,位于空格和换行符中间的内容就是我们想要得到的文件名。下面是首尾法的主要代码,请大家参考:

    start = strchr(p,' ');
    end = strchr(p,'\n');
    strncpy(file_name,p+5,end-start-1); // get the file name in inputting command

2.读取并且显示文件中的内容

我们使用fgets函数读取文件中的内容,并且通过printf函数显示到终端中。显示的时候只显示一个屏幕大小的内容,如果用户输入了其它显示命令,再依据输入的命令来显示其它内容。下面是主要的代码:

    while(NULL != fgets(buf,PATH_SIZE,fp))
    {
        //just for show the content in 1 terminal
        if(current_line < term_row-1)
        {
            printf("line: %-4d:",current_line);
            printf("%s",buf);
            current_line++;
        }
        else //wait the new commend of terminal
        {
        }
    }

这里说的“一个屏幕大小“是指显示文件内容的行数与当前终端的行数相同,通俗点来讲,就是说当前终端有多大,我们就显示多少内容。这里有个难点:获取终端的大小。我们在前面的章回中介绍过该内容(有忘记的看官可以点击这里查看),这里不再介绍,下面是主要代码,请大家参考:

int get_term_info(int *row, int *col)
 {
    int res =0;

    res = setupterm(NULL,fileno(stdout),NULL);
    if(res == -1)
    {
        printf("set terminal failed \n");
        return 1;
    }
    *row = tigetnum("lines");
    *col = tigetnum("cols");

    if(-2 == *row || -2 == *col)
        return 1;

 }

在该过程中,我们还获取了文件的位置,文件的内容已经显示出来了,获取文件位置有什么用处呢?我们先不说,留下个悬念,以后再给大家解开这个悬念。

3.响应用户命令

响应用户命令的内容比较多,我们下个章回再给大家详细介绍。


各位看官,关于DIY less命令的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值