【问题标题】:Linux tree command implementation in CC语言中的Linux树命令实现
【发布时间】:2018-05-19 14:22:39
【问题描述】:

这不是重复的,我需要在 C 中实现树程序,但在 Stack Overflow 上,我发现只有缩进仅由空格组成的实现,并且在进入子目录时它们不打印管道字符


即使在子目录中我有不同级别的缩进,我如何打印管道和空格? 而且,我怎么知道什么时候到达最后一个文件,以便我打印 ` 字符而不是管道?

【问题讨论】:

  • 您可能需要一个函数 void indent(int levels); 来执行 printf("| "); 大约 levels 次数。调用它,然后显示文件名。
  • 在您进入子目录的位置,您知道该子树中所有内容的缩进的前导部分应该是什么。将其作为参数传递。
  • 我无法阅读屏幕截图。请以文本形式发布测试。
  • "只找到实现 我认为我的任务是不是在互联网上寻找解决方案,而是自己编一个解决方案,对吧?
  • 如果您分享您的尝试,人们将更有可能发布答案。

标签: c linux tree


【解决方案1】:

规则是:

  • 不要对根(或基)目录使用任何缩进。

  • 从最年长的父目录开始,一直到父目录,检查父目录是否是其父目录中的最后一项。 对于那些,使用作为缩进;否则,使用

  • 如果当前项是父目录的最后一项,使用└─缩进;否则,使用├─

实际上,您需要先扫描(并记住)目录的内容,然后再访问其任何子目录。


如果您以递归方式执行此操作,则可以使用单个动态分配的缓冲区进行缩进;它包含父目录的竖线和空格。最后一项(带有水平条)单独打印。当您执行递归调用以打印子目录的内容时,首先将空格或竖线附加到缩进字符串(取决于子目录是否是当前目录中的最后一项)。递归调用后,将缩进字符串修剪回原来的长度。

请注意,您必须将项目的名称存储在数组或链表中的目录中,因为在递归到任何子目录之前都需要它们。如果不这样做,您将无法知道某个项目是否是其目录中的最后一个项目,并且您无法正确执行输出。您必须动态保留名称,没有任何计数或长度限制,因为在实践中没有这样的限制。 (即使某些机器有一些限制,它们也取决于所使用的文件系统,并且除非超过它们,否则无法真正发现。)

我编写的一个测试实现,首先使用nftw() 构造一个完整的树结构,然后将其打印出来,大约有 300 行长,包括所有错误检查。不,我不会发布它,因为它会被邪恶的学生滥用,作为他们自己的作品传递。

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多