linux下使用c語言模擬tail n 命令

2022-09-07 15:57:25 字數 2141 閱讀 4716

為了加深一下對linux下常規命令的理解順帶寫作業,就用c語言模擬了一下tail命令。

首先簡單介紹一下tali命令的用法。

tail test.txt:顯示test.txt檔案的最後十行

tail -n 5 test.txt:顯示test.txt檔案最後五行

當然tail命令還有tail -f這個用法,用於實時更新檔案的最後十行,不過為了偷懶就沒寫了,思路差不多,只是需要隔一段時間重新重新整理一下。

同時,如果後面給的檔案路徑或者檔名等寫錯了,或者寫的引數不正確,導致引數錯誤或檔案找不到的話,也會有提示資訊。

作為小白,下面寫的內容只要會c語言基本語法就能看懂,不會的地方我均寫了解釋或者放上了參考文件。

廢話不多說,開始講解思路:

1、初始化預設讀取長度line=10,如果使用了-n引數設定了長度為x,那麼就讓line=x

2、一行一行讀取檔案並儲存在陣列。但是我是模擬了一下迴圈陣列,即當陣列長度達到line了就將陣列下一次寫入的位置下標設定為0,這樣在一定程度上保證了不會因為檔案太大而溢位。

舉個例子:假如檔案一共15行,儲存檔案每一行資料的陣列為char buffer,第0-9行存放在buffer[0] - buffer[9] 之中,但是第10行資料又會被儲存到buffer[0]中,因為最後只需要輸出10行即可,所以只需要儲存距離當前位置的最後十行。不過為了輸出時候保證位置正確,肯定是要記錄陣列下標的。

3、開始輸出了,輸出是對buffer陣列進行迴圈遍歷,迴圈的次數等於min(line,文章行數)。

然後從前面儲存的下標開始輸出即可。

思路清晰了,就到了具體實現中存在的問題了。

首先,main函式的引數是什麼意思?

請參考:

然後,既然需要讀取-n 5 檔案路徑這些資訊,而且並不知道-n 5這樣的引數是否會存在,如何解決?

請參考:

再之後,如何一行一行讀取檔案?

read的用法詳解

1) 定義乙個緩衝區,用read將檔案全部存入緩衝區再通過\n來識別換行。明顯的乙個缺陷就是當檔案太大的時候緩衝區會存不下,浪費了儲存空間。

2) 每次讀乙個字元,然後儲存到乙個臨時緩衝佇列裡,讀取到第乙個\n後將緩衝佇列裡的資料當成一行儲存。缺點在於效率低下。

這兩種思路是在乙個論壇裡總結出來的,論壇鏈結

,所以接下來還是老實使用fgets吧。

這個就很簡單啦,參考:fgets讀取檔案

最後就是我的原始碼咯,標頭檔案可能多了點,因為原來使用read加上去的,但是嫌read太麻煩還是改成fgets了。

#include

#include

#include

#include

#include

#include

#include

#define buffsize 512

int main(int argc,char **ar**)

//獲取檔案路徑,optind是某個標頭檔案裡的東西,不是我定義的,指示的是ar**中下乙個要讀取的資料的下標

char *path = ar**[optind];

file *fp;

intindex = 0;

//如果檔案開啟不成功,肯定是檔案沒找到,就報錯

if((fp = fopen(path,"r")) == null)

//下面就是前面講的思路了,讀取檔案儲存到陣列

while(!feof(fp))

else

}//記得關閉fp

fclose(fp);

int i;

if(count

< line)

//因為前面是用的++,多加了1

if(index != 0)

for(i = 0;i"%s",buffer[index++]);

if(index >= line)}}

執行如圖:

Linux環境下C語言模擬記憶體負載測試

今天用c語言實現乙個memory負載的壓力測試程式.include include include define page sz 1 12 int main printf allocated lu mb n unsigned long i page sz 20 getchar return 0 系統...

使用C語言簡單模擬Linux的cat程式

先給出原始碼 include include include void print int fd len read fd,buf,10 void prin int main int argc,char argv argc引數個數,注意為1時代表沒有引數 只有程式名字 argv是指引數,argv 1 ...

Linux下 使用C語言編寫who命令

在linux 下 who命令是查詢當前登入的每個使用者。who的預設輸出包括使用者名稱 終端型別 登入日期及遠端主機。如圖 我們man一下who,在聯機幫助裡可以看到,who命令是讀取 var run utmp檔案來得到以上資訊的。我們在man一下utmp,知道utmp這個檔案,是二進位制檔案,裡面...