C++实现简单的ls命令及其原理.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

C++实现简单的ls命令及其原理

目录思维导图准备工作对控制参数的处理对dir参数的处理函数实现实现完整代码总结

思维导图

准备工作

对控制参数的处理

一共有7个可选参数,分别是-a、-l、-R、-t、-r、-i、-s,这些参数可以相互自由组合,因此可以设计一种机制,就是直接把它们全部用循环一次性做或运算,得到一个参数标记Vec。

//标记:-a、-l、-R、-t、-r、-i、-s参数(向量分量)

#definea0b1000000

#definel0b0100000

#defineR0b0010000

#definet0b0001000

#definer0b0000100

#defineI0b0000010

#defines0b0000001

//向量

intVec=0;

而Vec可以使用全局变量,这样可以避免写函数时不断地给函数参数加入地址参数,使得更加代码整洁,更直观。

对dir参数的处理

同理,依然可以设计一个全局容器,不断地把dirname扔进去:

char*dirname[4096*128];

intdirlen=0;

而对于filename也是一样的,但在每次遍历一个dir之前,就得filename容器做重置处理:

char*filenames[4096*128];

intfile_cnt=0;

函数实现

voidtags_cal(intargc,char*argv[]){

for(inti=1;iargc;i++){

if(argv[i][0]!=

-){//只接受以-开头的参数,其它参数要么错误,要么是文件夹名称或文件名

char*tempdirname=(char*)malloc(sizeof(char)*4096);

strcpy(tempdirname,argv[i]);

dirname[dirlen++]=tempdirname;

}else{

intlen=strlen(argv[i]);

for(intj=1;jlen;j++){

switch(argv[i][j]){

casea:

Vec|=a;

break;

casel:

Vec|=l;

break;

caseR:

Vec|=R;

break;

caset:

Vec|=t;

break;

caser:

Vec|=r;

break;

casei:

Vec|=I;

break;

cases:

Vec|=s;

break;

default:

fprintf(stderr,%c参数错误!\n,argv[i][j]);

break;

if(dirlen==0){

dirlen=1;

char*tempdirname=(char*)malloc(sizeof(char)*2048);

strcpy(tempdirname,.);

dirname[0]=tempdirname;

}

这里需要注意的是,如果dirlen==0,说明我们的命令并没有加参数,默认是对当前文件夹进行操作,因此需要重新对dirlen赋值为1,然后把dirname[0]置为.。

实现

我们上一步成功得到了,dirnname、dirlen,这样就可以逐个dirname[i]进行处理了!

voiddo_myls(){

for(inti=0;idirlen;i++){

if(do_name(dirname[i])==-1){

continue;

//且自动字典排序

if((Vect)==t){//时间排序

do_t(filenames);

if((Vecr)==r){//逆序

do_r(filenames,file_cnt);

printf(当前路径:\%s\\n,dirname[i]);

inttag=0;//换行

for(intj=0;jfile_cnt;j++){

//拼凑文件名

charpath[4096]={0};

s

文档评论(0)

152****4498 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档