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