因胸联盟 发表于 2015-1-18 11:29:03

Linux设计本人编写more命令仓酷云

Linux的常用命令find,察看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会就爱不释手。
more命令能够完成的功效是很丰厚的,包含形式查找。明天我们只是完成它的一个基础功效:

[*]more文件列表
[*]在屏幕注释显现已读的百分比
[*]按下回车显现下一行
[*]按下空格显现下一屏
[*]按下q加入
[*]按回车、空格、q时没有回显
这里有几个成绩:

[*]要在屏幕注释显现已读的百分比,那我们必需先猎取文件列表中各个文件的长度,这个可使用体系挪用lstat
#include<sys/stat.h>
structstat*buf;
lstat("filename",buf)//猎取文件形态
filesize+=buf->st_size;//猎取文件巨细
[*]要显现整屏内容,我们就必要晓得一屏能够显现几行,然后从文件中读出这么多行显现在屏幕上。
#include<termios.h>
structwinsize*ws;
ws=(structwinsize*)malloc(sizeof(structwinsize));
memset(ws,0x00,sizeof(structwinsize));
ioctl(STDIN_FILENO,TIOCGWINSZ,ws);
intwidth=ws->ws_col;
intheight=ws->ws_row;

[*]禁用回显
#include<termios.h>
structtermiosts;//终端属性
tcgetattr(STDIN_FILENO,&ts);//猎取终端属性
ts.c_lflag&=(~ECHO);//制止回显
tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts);//设置终真个新属性

[*]从终端读取单个字符后当即前往,不必要按回车
#include<termios.h>
structtermiosts;//终端属性
tcgetattr(STDIN_FILENO,&ts);//猎取终端属性
ts.c_lflag&=(~ICANON);//设置终端为非尺度形式
ts.c_cc=1;//这两行当必要从终端猎取字符时当即前往,不必要按回车键
ts.c_cc=0;
tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts);//设置终真个新属性
完全代码:
#include<stdio.h>#include<sys/ioctl.h>#include<fcntl.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<string.h>#include<termios.h>voidgettermsize(int*w,int*h);//猎取终端尺寸voiddo_more(FILE*);//依据see_more猎取的用户输出,显现更多的文件内容或加入intsee_more();//捕捉用户的输出指令voidsettermattr();//设置终端属性intwidth;//终端屏幕宽度intheight;//终端屏幕高度intfilesize;//文件的巨细intreadsize;//已显现的内容长度structtermiosts,ots;//终端属性intmain(intargc,char*argv[]){gettermsize(&width,&height);settermattr();FILE*fp;structstat*buf;filesize=0;readsize=0;buf=(structstat*)malloc(sizeof(structstat));memset(buf,0x00,sizeof(structstat));if(argc==1)//假如没有指定文件,则从尺度输出读取内容do_more(stdin);else{//从文件列表中读取内容inti;for(i=1;i<argc;i++){//more命令前面大概跟多个文件if((fp=fopen(*(argv+i),"r"))!=0){//以只读情势翻开文件if(lstat((constchar*)*(argv+i),buf)==0){//猎取文件形态filesize+=buf->st_size;//猎取文件巨细printf("fs=%ld
",buf->st_size);}else{exit(1);}fclose(fp);//封闭文件}else{//翻开文件失利,加入程序exit(1);}}printf("size=%d
",filesize);for(i=1;i<argc;i++){//more命令前面大概跟多个文件if((fp=fopen(*(argv+i),"r"))!=0){//以只读情势翻开文件do_more(fp);//显现文件内容fclose(fp);//封闭文件}else{//翻开文件失利,加入程序exit(1);}}}tcsetattr(STDIN_FILENO,TCSANOW,&ots);return0;}voidgettermsize(int*w,int*h){structwinsize*ws;ws=(structwinsize*)malloc(sizeof(structwinsize));memset(ws,0x00,sizeof(structwinsize));ioctl(STDIN_FILENO,TIOCGWINSZ,ws);*w=ws->ws_col;*h=ws->ws_row;}voidsettermattr(){tcgetattr(STDIN_FILENO,&ts);//猎取终端属性ots=ts;//备份终端属性ts.c_lflag&=(~ECHO);//制止回显ts.c_lflag&=(~ICANON);//设置终端为非尺度形式ts.c_cc=1;//这两行当必要从终端猎取字符时当即前往,不必要按回车键ts.c_cc=0;tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts);//设置终真个新属性。TCSAFLUSH暗示输入行列空了今后才失效,失效之前的输入行列被flush}voiddo_more(FILE*fp){intlinesize=width;charline;intnum_of_lines=0;//纪录本次读了几行intreply;//纪录see_more()的前往值FILE*fp_tty;while(fgets(line,linesize,fp)){//从文件中读取一行内容readsize+=strlen(line);//读出的内容长度if(num_of_lines==height){//假如满屏了reply=see_more();//从键盘猎取用户输出的命令if(reply==0){//用户不必要显现更多内容了,要加入tcsetattr(STDIN_FILENO,TCSANOW,&ots);exit(0);}num_of_lines-=reply;}if(fputs(line,stdout)==EOF){//把这行内容显现在用户屏幕上tcsetattr(STDIN_FILENO,TCSANOW,&ots);//TCSANOW暗示修正当即失效perror("fputs");exit(1);}num_of_lines++;}}intsee_more(){intc;printf("33[7m--more--(%2.0f%%)33[m",(double)readsize/filesize*100);while((c=getc(stdin))!=EOF){//注重加括号,赋值操纵符是右分离的。假如不加括号会把getchar()!=EOF的了局赋给cif(c==q){return0;}if(c==)//空格returnheight;if(c==
)//回车return1;}return0;}
Linux的常用命令find,察看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会就爱不释手。

冷月葬花魂 发表于 2015-1-21 07:46:58

要增加自己Linux的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个Linux发行版本,然后进入精彩的Linux世界,相信对于你自己的Linux能力必然大有斩获。

蒙在股里 发表于 2015-1-30 11:48:48

写学习日记,这是学习历程的见证,同时我坚持认为是增强学习信念的法宝。

再见西城 发表于 2015-2-16 00:38:31

Linux的成功就在于用最少的资源最短的时间实现了所有功能,这也是符合人类进化的,相信以后节能问题会日益突出。

爱飞 发表于 2015-2-18 05:50:30

linux鸟哥的私房菜,第三版,基础篇,网上有pdf下的,看它的目录和每章的介绍就行了,这个绝对原创!

谁可相欹 发表于 2015-3-6 00:37:44

用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户,估shell也称为命令解释器,有关命令的学习可参考论坛相关文章,精通英文也是学习Linux的关键。

admin 发表于 2015-3-6 04:57:56

在学习的过程中,我们用的是VM虚拟机,开始时真的不真的该怎么去做,特别是我的是命令窗口界面,别人的是图形界面,我都不知道怎么调过来。

简单生活 发表于 2015-3-6 19:29:21

选择一些适于初学者的Linux社区。

第二个灵魂 发表于 2015-3-9 22:14:04

其实老师让写心得我也没怎么找资料应付,自己想到什么就写些什么,所以不免有些凌乱;很少提到编程,因为那些在实验报告里已经说了,这里再写就多余了。

不帅 发表于 2015-3-11 10:23:40

以前觉得Linux就跟dos一样,全是用命令窗口,相对于窗口界面来说多麻烦呀。

金色的骷髅 发表于 2015-3-18 04:39:06

期间我阅读了不少关于Linux的相关资料,其中也不乏一些有趣的小故事,这既丰富了我的课余生活,也让我加深了对一些术语的理解,比玩游戏强多了。?

老尸 发表于 2015-3-25 11:36:05

其实当你安装了一个完整的Linux系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。
页: [1]
查看完整版本: Linux设计本人编写more命令仓酷云