為了加深一下對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這個檔案,是二進位制檔案,裡面...