天天看點

一起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-); // 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指令的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。