Я работаю над назначением, где меня просят закодировать некоторые из файлов unix. У меня есть проблема с вариантом -R.C: Неожиданное поведение, неверный список вернулся?
Некоторые контексты: Я использую структуру, содержащую 2 списка, одну для файлов, а другую для каталогов, которые будут переданы в качестве аргументов при запуске моих ls. Если аргументов нет, кроме параметров, я создаю dir-узел, содержащий «.».
Без опции -R, если в списке есть файлы, я передаю ее копию в функцию отображения, а затем очистку списка файлов. Если их нет, но есть каталоги, я открываю их, читаю и копирую его содержимое в список файлов, освобождаю текущий узел каталогов и продолжаю как с обычным списком файлов. Это прекрасно работает.
С опцией -R, тем не менее, я делаю то же самое, но при чтении каталога, если в нем есть вспомогательный каталог, я добавляю его в список каталогов. Теоретически это должно работать очень хорошо и предотвратить использование рекурсивности, но по какой-то причине список, возвращаемый для отображения, содержит только каталоги, файлы. И эта проблема, кажется, появляется только тогда, когда нет никаких аргументов, кроме вариантов ... Вот код:
t_list *ft_output_bigr(t_input *input)
{
t_list *dir_content;
DIR *dir_stream;
struct dirent *buf;
if (!input->files->content && !input->dir->content)
return (NULL);
if (input->files->content)
return (ft_lstcpy_and_del(input->files));
dir_stream = opendir(input->dir->content);
ft_lstfreeone(&input->dir, input->dir);
while ((buf = readdir(dir_stream)))
{
dir_content = ft_lstnew(buf->d_name, sizeof(buf->d_name));
ft_lstadd(&input->files, dir_content);
if ((ft_is_dir(buf->d_name)) && ft_strcmp(buf->d_name, ".") != 0
&& ft_strcmp(buf->d_name, "..") != 0)
{
ft_lstadd(&input->dir, dir_content);
}
}
closedir(dir_stream);
return (ft_lstcpy_and_del(input->files));
}
А вот функция, которая вызывает его, который обрабатывает параметры и дисплей.
int ft_process_input(t_input **input)
{
t_list *output;
while ((output = (ft_strchr((*input)->opt, 'R')) ? ft_output_bigr(*input)
: ft_output(*input)))
{
output = (ft_strchr((*input)->opt, 'a')) ? output
: ft_rem_hidden(&output);
output = (ft_strchr((*input)->opt, 't')) ? ft_t(&output)
: ft_parse(&output);
output = (ft_strchr((*input)->opt, 'r')) ? ft_lstrev(&output) : output;
output = (ft_strchr((*input)->opt, 'l')) ? ft_l(output) : output;
while (output)
{
ft_putendl(output->content);
ft_lstfreeone(&output, output);
}
}
return (1);
}
Я проверил список файлов, прежде чем возвращать его, и кажется, что все в порядке. Но по какой-то причине, как только он передается process_input, bam, остаются только каталоги. Так что, я потерялся здесь. Из идей попробовать ... Помогите? : D
Редактировать: Добавить информацию о поведении. Так что я думал, что мой список был в порядке до возвращения, потому что я проверил первый узел, и все было в порядке. Дурак я. Список фактически завинчивается перед возвратом, что, по крайней мере, имеет смысл. Так что, похоже, что файлы и списки dir перепутаны каким-то образом, и когда я возвращаю input-> files, вместо этого возвращается input-> dir. Я намекаю на что-то вдоль линии обоих списков, указывающих на ту же голову (глава списка директорий), как и lstadd dir_content для обоих. Я попытаюсь добавить копию dir_content или что-то еще, и вернусь с новостями.
Вы проделали какую-либо отладку, чтобы сузить место, где проблема? –
@MarshallTigerus Ну, я новичок в программировании, но я попробовал то, что знаю. Проверка значений переменных, таких как input-> files-> content в цикле readdir, или прямо перед возвратом, и эта часть выглядит просто отлично. Странная часть состоит в том, что тот же самый код используется для обычного листинга (no -R), и он работает отлично. Все, что я добавил, это «Если это каталог, добавьте его в список dir» во время цикла readdir. –
Некоторые рекомендации: когда я выполняю свои ls с помощью * -R, он «работает», как ожидалось, то есть он пытается получить доступ к файлам в ./Dir и не может, потому что dir name! = Pathname. Все в порядке, я знаю, что в какой-то момент я должен это обработать. Тем не менее, список файлов заполняется и возвращается как следует. Только при выполнении моего ls только с -R возвращаются только каталоги, поэтому я думаю, что это имеет какое-то отношение к моему "." dir node, но опять же, эта часть работает отлично, когда не используется опция -R. –