2014-12-01 5 views
-1

Я работаю над назначением, где меня просят закодировать некоторые из файлов 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 или что-то еще, и вернусь с новостями.

+1

Вы проделали какую-либо отладку, чтобы сузить место, где проблема? –

+0

@MarshallTigerus Ну, я новичок в программировании, но я попробовал то, что знаю. Проверка значений переменных, таких как input-> files-> content в цикле readdir, или прямо перед возвратом, и эта часть выглядит просто отлично. Странная часть состоит в том, что тот же самый код используется для обычного листинга (no -R), и он работает отлично. Все, что я добавил, это «Если это каталог, добавьте его в список dir» во время цикла readdir. –

+0

Некоторые рекомендации: когда я выполняю свои ls с помощью * -R, он «работает», как ожидалось, то есть он пытается получить доступ к файлам в ./Dir и не может, потому что dir name! = Pathname. Все в порядке, я знаю, что в какой-то момент я должен это обработать. Тем не менее, список файлов заполняется и возвращается как следует. Только при выполнении моего ls только с -R возвращаются только каталоги, поэтому я думаю, что это имеет какое-то отношение к моему "." dir node, но опять же, эта часть работает отлично, когда не используется опция -R. –

ответ

2

Хорошо, исправлено. Мораль истории: вы не можете просто добавить узел в 2 списка и ожидать, что в результате получится 2 разных списка.

+0

Справа. Добавление чего-то в список не создает новый список, он изменяет существующий список. –

Смежные вопросы