gpt4 book ai didi

c - 返回 C 中文件夹中的文件列表

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:23 25 4
gpt4 key购买 nike

我有这段代码可以将给定文件夹中具有给定扩展名的所有文件打印到控制台:

int scandir(char dirname[], char const *ext)
/* Scans a directory and retrieves all files of given extension */
{
DIR *d = NULL;
struct dirent *dir = NULL;

d = opendir(dirname);

if (d)
{
while ((dir = readdir(d)) != NULL)
{
if (has_extension(dir->d_name, ext))
{
printf("%s\n", dir->d_name);
}
}
closedir(d);
}
return(0);
}

此函数有效,但我想对其进行修改,使其返回一个文件名数组。(我做了很多谷歌搜索,但只提出了像我这样的功能,打印到控制台)

我对 C 和“低级”编程还很陌生,所以我不确定如何正确处理这里的内存。当我不知道字符数组有多大时,如何创建字符数组并将其添加到字符数组?

我正在使用 MinGW..

最佳答案

你可以使用realloc:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>

extern char *strdup(const char *src);

int scandir(char ***list, char dirname[], char const *ext)
/* Scans a directory and retrieves all files of given extension */
{
DIR *d = NULL;
struct dirent *dir = NULL;
size_t n = 0;

d = opendir(dirname);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
if (has_extension(dir->d_name, ext))
{
*list = realloc(*list, sizeof(**list) * (n + 1));
(*list)[n++] = strdup(dir->d_name);
}
}
closedir(d);
}
return n;
}

int main(void)
{
char **list = NULL;
size_t i, n = scandir(&list, "/your/path", "jpg");

for (i = 0; i < n; i++) {
printf("%s\n", list[i]);
free(list[i]);
}
free(list);
return 0;
}

请注意,strdup() 不是标准函数,但它可用于许多实现。

作为 realloc 的替代方案,您可以使用 singly linked list字符串。

编辑: 正如@2501 所指出的,最好从 scandir 返回分配的字符串数组并将 elems 作为参数传递:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>

extern char *strdup(const char *src);

char **scandir(char dirname[], char const *ext, size_t *elems)
/* Scans a directory and retrieves all files of given extension */
{
DIR *d = NULL;
struct dirent *dir = NULL;
char **list = NULL;

d = opendir(dirname);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
if (has_extension(dir->d_name, ext))
{
list = realloc(list, sizeof(*list) * (*elems + 1));
list[(*elems)++] = strdup(dir->d_name);
}
}
closedir(d);
}
return list;
}

int main(void)
{
size_t i, n = 0;
char **list = scandir("/your/path", "jpg", &n);

for (i = 0; i < n; i++) {
printf("%s\n", list[i]);
free(list[i]);
}
free(list);
return 0;
}

最后,你真的需要数组吗?考虑使用回调函数:

#include <stdio.h>
#include <string.h>
#include <dirent.h>

void cb_scandir(const char *src)
{
/* do whatever you want with the passed dir */
printf("%s\n", src);
}

int scandir(char dirname[], char const *ext, void (*callback)(const char *))
/* Scans a directory and retrieves all files of given extension */
{
DIR *d = NULL;
struct dirent *dir = NULL;
size_t n = 0;

d = opendir(dirname);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
if (has_extension(dir->d_name, ext))
{
callback(dir->d_name);
n++;
}
}
closedir(d);
}
return n;
}

int main(void)
{
scandir("/your/path", "jpg", cb_scandir);
return 0;
}

关于c - 返回 C 中文件夹中的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357792/

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