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

来源:互联网 发布:vb的注释符号 编辑:程序博客网 时间:2024/05/16 06:50

各位看官们,大家好,上一回中咱们说的是文件定位的例子,这一回咱们说的例子是: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命令的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


0 0
原创粉丝点击