gpt4 book ai didi

C:递归打开子目录并创建新文件

转载 作者:太空狗 更新时间:2023-10-29 15:26:37 24 4
gpt4 key购买 nike

我正在写一些递归查找 .c 和 .h 文件并删除所有注释的东西(就像学习练习一样)。对于找到的每个 .c/.h 文件,该程序都会创建一个附加文件,该文件等同于没有注释的原始文件。因此,例如,“helloworld.c”将产生一个附加文件“__helloworld.c”

我遇到的问题是这样的:

我有一个循环遍历目录中的所有条目,并一直循环直到它停止查找扩展名为 .c 或 .h 的文件。然而,循环实际上并没有结束,因为每次找到一个文件时,都会创建另一个文件。所以我有这种递归情况,其中“__helloworld.c”变成“____helloworld.c”,变成“______helloworld.c”,等等。(如果有人建议,是的,新文件必须有一个 .c 扩展名。)一种可能的解决方案可能是跟踪 inode 编号,因此我们只知道迭代原始文件,但这需要循环的多次迭代:一次计算目录条目,(并使用此数字为 inode nums 初始化数组),两次存储 inode 编号,最后第三次完成这项工作。

任何人都可以分享任何可以在一次循环中实现这一目标的想法吗?代码分为两个文件,因此我发布了主要的递归例程:

consume_comments(): 将单个文件作为参数,创建省略注释的新文件

我的主要例程几乎只是处理一些参数 - 下面发布的例程才是真正的问题所在。

/*
opens a directory stream of the dir pointed to by 'filename',
looks for .c .h files, consumes comments. If 'rc' == 1, find()
calls itself when it encounters a sub-directory.
*/
int find (const char * dirname)
{
int count = 3;
DIR * dh;
struct dirent * dent;
struct stat buf;
const char * fnext;
int filecount = 0;

chdir(dirname);

if ((dh = opendir(".")) == NULL)
{
printf("Error opening directory \"%s\"\n", dirname);
exit(-1);
}

while ((dent = readdir(dh)) != NULL)
{
if (count) count--;
if (!count)
{
if (lstat(dent->d_name, &buf) == -1)
{
printf("Error opening file \"%s\" for lstat()\n", dent->d_name);
exit(EXIT_FAILURE);
}

if (S_ISDIR(buf.st_mode) && rc)
{
find(dent->d_name);
chdir("..");
//when this find() completes, it will be one level down:
//so we must come back up again.
}
if (S_ISREG(buf.st_mode))
{
fnext = fnextension(dent->d_name);
if (*fnext == 'c' || *fnext == 'h')
{
consume_comments(dent->d_name);
printf("Comments consumed:%20s\n", dent->d_name);
}
}
}
}
}

最佳答案

您可以使用 3 种解决方案中的一种

  1. 正如@Theolodis 在评论中所建议的那样,忽略以__
  2. 将您的算法分成两部分。在第一部分准备一份 list 所有 .c.h 文件(递归)。在第二步中,浏览列表并生成文件的剥离版本(非递归)。
  3. 在一些临时目录中准备剥离的 .c.h 文件(Linux 中的 /tmp 或 Windows 中的 %TEMP%)并将其移动到文件夹一次文件夹中的所有.c.h文件都已经处理完毕。现在扫描所有子文件夹。

关于C:递归打开子目录并创建新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23737715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com