各位看官們,大家好,上一回中咱們說的是檔案定位的例子,這一回咱們說的例子是: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-); // get the file name in inputting command
2.讀取并且顯示檔案中的内容
我們使用
fgets函數
讀取檔案中的内容,并且通過
printf函數
顯示到終端中。顯示的時候隻顯示一個螢幕大小的内容,如果使用者輸入了其它顯示指令,再依據輸入的指令來顯示其它内容。下面是主要的代碼:
while(NULL != fgets(buf,PATH_SIZE,fp))
{
//just for show the content in terminal
if(current_line < term_row-)
{
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 =;
res = setupterm(NULL,fileno(stdout),NULL);
if(res == -)
{
printf("set terminal failed \n");
return ;
}
*row = tigetnum("lines");
*col = tigetnum("cols");
if(- == *row || - == *col)
return ;
}
在該過程中,我們還擷取了檔案的位置,檔案的内容已經顯示出來了,擷取檔案位置有什麼用處呢?我們先不說,留下個懸念,以後再給大家解開這個懸念。
3.響應使用者指令
響應使用者指令的内容比較多,我們下個章回再給大家詳細介紹。
各位看官,關于DIY less指令的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。