ls -a 分栏算法的问题---如果确定第一栏要输出几个文件名

popil1987 2008-10-31 11:27:38
用过ls -a的朋友都知道,它会把所有文件按顺序竖着排列,为了说明问题,例子很长。

. askjflksjdfjdklfj csdflshdfjhf esjfljsdlfjsldjflsdjfljsdlkfjlsdfk
.. bslkdfjlksdfklkldsdjk d

以上分四栏,每栏的长度是该栏最大文件名的长度。例如,第二栏最大长度是“bslkdfjlksdfklkldsdjk“的长度,第三栏长度是“csdflshdfjhf“的长度。
我原来以为它是通过预先定义分几栏,每一栏文件名的指针用一个数组或链表保存,比如分三栏的话,保存到a1[max],a2[max],a3[max]等,然后

int i;
for(i=0;i<max;i++)
{
printf("%s %s %s",a1[i],a2[i],a3[i])
}



. csdflshdfjhf
.. d
askjflksjdfjdklfj esjfljsdlfjsldjflsdjfljsdlkfjlsdfk
bslkdfjlksdfklkldsdjk flsjflsjfljsdlkfjlksdjfljlklskdjflsdjflksdfklj




. d
.. esjfljsdlfjsldjflsdjfljsdlkfjlsdfk
askjflksjdfjdklfj flsjflsjfljsdlkfjlksdjfljlklskdjflsdjflksdfklj
bslkdfjlksdfklkldsdjk g
csdflshdfjhf


很显然,结果并不像我想的那样,这确实是竖着,一栏一栏来输出的。我通过阅读ls的源代码,发现它包含termios.h头文件,好的,它可以竖着输出,即便那样,它怎样知道一栏输出3个文件还是四个文件好!

. csdflshdfjhf g
.. d h
askjflksjdfjdklfj esjfljsdlfjsldjflsdjfljsdlkfjlsdfk i
bslkdfjlksdfklkldsdjk flsjflsjfljsdlkfjlksdjfljlklskdjflsdjflksdfklj


我仔细想了一下它的流程,假设它有一大堆文件名要输出,它可以竖着输出,首先它要判断竖着输出多少个文件名合适,如果确定了第一栏的输出个数,后面各栏输出的文件名个数就确定了。

第一栏输出的文件名个数如何确定,或者termios.h文件有别的神奇的功能?
...全文
224 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gamedragon 2008-11-03
  • 打赏
  • 举报
回复
所以说是要迭代几次才能找出合适的宽度。
如果你注意ls的排版的话,会发现它的每一列宽度不一定相同的,就是按该列最长文件名来的。
popil1987 2008-11-03
  • 打赏
  • 举报
回复
间距只有一个字符!
不过,按照你的想法,我想,根据最大文件名的字符个数分栏可以快一些。
比如,假设终端每一行最多容纳100个字符,如果已知最大文件名字符数是55,间距是1,那么初始栏数是(100-55-1(间距))/(1(最短文件名)+1(间距))
但可以预想最坏的情况是最大文件名字符数是1的情况。
而且,这样分栏后,还要比较每一栏的最大字符数是否超过分栏时候假设的最短文件名。
例如,我们分栏时假设最短文件名长度是2个字符,根据你的算法,100/(1+2)=4栏,那我们接下来就要保证所有栏的文件名程度都要小于等于2
gamedragon 2008-11-01
  • 打赏
  • 举报
回复
要考虑每列之间是有间距的。
初始的N就可以是 宽度/(1+间距)。
popil1987 2008-10-31
  • 打赏
  • 举报
回复
2楼,这个N怎么确定,假设我所有的文件都只有一个字符,那至少有几百栏吧。。。
genghb 2008-10-31
  • 打赏
  • 举报
回复
终端宽度是可变的 不是看头文件的 拖一下输出也不一样
gamedragon 2008-10-31
  • 打赏
  • 举报
回复
先假设N列,总数已知,每列多少就知道了,排列一下,超出宽度了就减少列数。迭代几次就行了吧,没LZ说的这么神奇。
termios.h这里估计只是有一些可以找当前terminal宽度的函数而已。
本课程演示的是一套基于SpringBoot 电子商城网站,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者和爱好者。本教程适合有一定 Java基础的童鞋,如可进入我的主页学习Java基础,先学基础、先学基础、先学基础,重要的事说三遍。如果你基础不错或者你只想要这个系统的源码。  系统共分为以下几个模块:首页导航栏轮播图分栏推荐 搜索显示关键词搜到的产品能通过产品进入详情页 详情页显示商品详情多图画廊展示购物车 购物车显示加入购物车产品信息 登录注册实现登录注册功能 后台管理后台首页商品管理用户管理 技术实现 IOC容器:SpringBoot持久层:MyBatis数据源:druid 日志:log4j 前端框架:jstl   首页界面  ------------------------------------------------------------------------------------------------------------------------   1. 详细的功能说明文档 2. 从 0到1 开始部署运行本套系统 3. 该项目附带的源码资料及开发工具可以使用 4. 提供技术答疑和协助指导等 5. 本套教程包含:系统源码、系统项目文档、数据库脚本SQL、开发软件工具等 6. 如果你对系列课程中其他教程有需要,联系告知老师,提前录制 7. 整套系列课程都在陆续更新中 ------------------------------------------- ​更多详细内容在课后文档 ------------------------------------------ 

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧