Реализация команды дерева Linux в C - PullRequest
0 голосов
/ 19 мая 2018

Это не дубликат, мне нужно реализовать древовидную программу на C, но в Stack Overflow я нахожу только реализации, в которых отступ сделан только из пробелов, и они не печатают символ канала при переходе в подкаталоги


enter image description here

Как я могу напечатать трубы и пробелы, даже если в подкатегориях у меня другой уровень отступа?А также, как я могу узнать, когда достигну последнего файла, чтобы я напечатал символ `вместо канала?

1 Ответ

0 голосов
/ 20 мая 2018

Правила таковы:

  • Не используйте отступы для корневого (или базового) каталога.

  • Начиная со старшего родителя, вплоть до родителя, проверьте, является ли родительский каталог последним элементом в его собственном родительском каталоге.Для тех, которые есть, используйте для отступа;в противном случае используйте .

  • Если текущий элемент является последним элементом в родительском каталоге, используйте └─ для отступа;в противном случае используйте ├─.

На практике вам необходимо сканировать (и запоминать) содержимое каталога, прежде чем переходить к любому из его подкаталогов.


Если вы делаете это рекурсивно, вы можете использовать один динамически выделенный буфер для отступа;он содержит вертикальные полосы и пробелы для родительских каталогов.Последний элемент (с горизонтальной полосой) печатается отдельно.Когда вы делаете рекурсивный вызов для печати содержимого подкаталога, сначала добавьте пробел или вертикальную черту к строке отступа (в зависимости от того, является ли подкаталог последним элементом в текущем каталоге или нет).После рекурсивного вызова обрежьте строку отступа до ее первоначальной длины.

Обратите внимание, что вам придется хранить имена элементов в каталоге в массиве или связанном списке, потому что все они нужны перед повторениемв любой подкаталог.Если вы этого не сделаете, вы не сможете узнать, является ли элемент последним в своем каталоге или нет, и вы не сможете сделать вывод правильно.Вы должны хранить имена динамически, без ограничений по количеству или длине, потому что на практике таких ограничений нет.(Даже если на некоторых машинах существуют некоторые ограничения, они зависят от используемой файловой системы и не могут быть обнаружены в действительности, за исключением случаев их превышения.)

Тестовая реализация, которую я написал, используя nftw(), чтобы сначала построить полную древовидную структуру, а затем распечатать ее, было длиной около 300 строк, включая все проверки ошибок.Нет, я не буду публиковать это, потому что это будет неправильно использоваться гнусными студентами, которые будут рассматриваться как их собственная работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...