我正在进行一项任务,我被要求编写一些unix的ls代码。 我遇到问题的部分是-R选项。
某些背景: 我正在使用一个包含2个列表的结构,一个用于文件,另一个用于在运行ls时作为参数传递的目录。如果除了options之外没有其他参数,我创建一个包含“。”的目录节点。
如果没有-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
编辑:添加有关行为的信息。 所以我认为我的列表在返回之前是正常的,因为我检查了第一个节点,它没问题。傻我。该列表实际上在返回之前被搞砸了,这至少更有意义。 所以似乎正在发生的是文件和目录列表以某种方式混合,当我返回input->文件时,返回input-> dir。 我暗示两个列表中的某些东西指向同一个头(dir列表的头部),因为我向两者添加了dir_content。我会尝试添加dir_content或其他东西的副本,然后回复新闻。
答案 0 :(得分:2)
好的,修好了。 故事的道德:您不能简单地将节点添加到2个列表中,并且期望结果有2个不同的列表。