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...