自己編寫more命令

2021-06-11 12:53:56 字數 2378 閱讀 5445

more命令可以實現的功能是很豐富的,包括模式查詢。今天我們只是實現它的乙個基本功能:

more  檔案列表

在螢幕正文顯示已讀的百分比

按下回車顯示下一行

按下空格顯示下一屏

按下q退出

按回車、空格、q時沒有回顯

這裡有幾個問題:

要在螢幕正文顯示已讀的百分比,那我們必須先獲取檔案列表中各個檔案的長度,這個可以使用系統呼叫lstat

#include

struct stat *buf;

lstat("filename",buf) //獲取檔案狀態

filesize+=buf->st_size; //獲取檔案大小 

要顯示整屏內容,我們就需要知道一屏可以顯示多少行,然後從檔案中讀出這麼多行顯示在螢幕上。

#include

struct winsize *ws;

ws=(struct winsize*)malloc(sizeof(struct winsize));

memset(ws,0x00,sizeof(struct winsize));

ioctl(stdin_fileno,tiocgwinsz,ws);

int width=ws->ws_col;

int height=ws->ws_row;

禁用回顯

#include

struct termios ts; //終端屬性

tcgetattr(stdin_fileno,&ts); //獲取終端屬性 

ts.c_lflag &= (~echo); //阻止回顯

tcsetattr(stdin_fileno,tcsaflush,&ts); //設定終端的新屬性

從終端讀取單個字元後立即返回,不需要按回車

#include

struct termios ts; //終端屬性

tcgetattr(stdin_fileno,&ts); //獲取終端屬性 

ts.c_lflag &= (~icanon); //設定終端為非標準模式

ts.c_cc[vmin]=1; //這兩行當需要從終端獲取字元時立即返回,不需要按回車鍵

ts.c_cc[vtime]=0;

tcsetattr(stdin_fileno,tcsaflush,&ts); //設定終端的新屬性 

完整**:

#include#include#include#include#include#include#include#include

#includevoid gettermsize(int *w,int *h); //

獲取終端尺寸

void do_more(file *); //

根據see_more獲取的使用者輸入,顯示更多的檔案內容或退出

int see_more(); //

捕獲使用者的輸入指令

void settermattr(); //

設定終端屬性

int width; //

終端螢幕寬度

int height; //

終端螢幕高度

int filesize; //

檔案的大小

int readsize; //

已經顯示的內容長度

struct termios ts,ots; //

終端屬性

int main(int argc,char *argv)

else

fclose(fp); //

關閉檔案

}else

}printf("

size=%d\n

",filesize);

for(i=1;i//

more命令後面可能跟多個檔案

if((fp=fopen(*(argv+i),"

r"))!=0)

else}}

tcsetattr(stdin_fileno,tcsanow,&ots);

return0;}

void gettermsize(int *w,int *h)

void settermattr()

void do_more(file *fp)

num_of_lines-=reply;

}if(fputs(line,stdout)==eof)

num_of_lines++;

}}int see_more()

if(c=='

') //

空格return height;

if(c=='

\n') //

回車return

1; }

return

0;}

自己編寫的more命令

重定向方面存在缺憾 重定向後沒有除錯完成 stdin時非重定向可用read和write遮蔽部分部分 include include include include include lstat include lstat include define pagelen 24 define linelen...

more命令 less命令

more命令是乙個基於vi編輯器文字過濾器,它以全螢幕的方式按頁顯示文字檔案的內容,支援vi中的關鍵字定位操作。more名單中內建了若干快捷鍵,常用的有h 獲得幫助資訊 enter 向下翻滾一行 空格 向下滾動一屏 q 退出命令 該命令一次顯示一屏文字,滿屏後停下來,並且在螢幕的底部出現乙個提示資訊...

自己編寫的linux ls命令

include include include include include include include include include include int aflag 0 int lflag 0 typedef char datatype typedef struct node link...