的主要问题是,当它被称为readdir()
功能不保留先前返回值的第二次:
应用程序不得修改结构,其中readdir()
点的返回值,也不结构内指针指向的任何存储区域。返回的指针和结构中的指针可能会失效,或者结构或存储区域可能会被同一目录流上的后续调用readdir()
覆盖。他们不会受到在不同目录流上致电readdir()
的影响。
因此,您必须为每对条目中的第一个创建一个名称副本。据推测,你有strdup()
可用,所以这是最轻微的痛苦。 (如果或许您没有strdup()
做,这是很容易写你自己的版本 - 7线,包括与他们仅支撑线)在stderr.h
宣布
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "stderr.h"
int main(int argc, char **argv)
{
err_setarg0(argv[0]);
if (argc > 2)
err_usage("[directory]");
char *dir = ".";
if (argc == 2)
dir = argv[1];
DIR *dp = opendir(dir);
if (dp == NULL)
err_syserr("failed to open directory '%s': ", dir);
char *name_0 = 0;
int counter = 0;
struct dirent *name;
while ((name = readdir(dp)) != NULL)
{
if (++counter % 2 == 1)
{
if ((name_0 = strdup(name->d_name)) == NULL)
err_syserr("failed to duplicate name '%s': ", name->d_name);
}
else
{
printf("(%s, %s)\n", name_0, name->d_name);
free(name_0);
name_0 = NULL;
}
}
if (counter % 2 == 1)
printf("(%s, %s)\n", name_0, "NULL");
free(name_0);
closedir(dp);
return 0;
}
(功能都开始err_
并大大简化错误报告,你可以在GitHub上找到他们的代码https://github.com/jleffler/soq/tree/master/src/libsoq。)
不明确!更具体。写下你期望的输出结果并提及你想要做的事 – minigeek
如果我的目录中有'a.txt','b.txt'和'c.txt',我想让代码打印'( a.txt,b.txt)\ n(c.txt,NULL)' – user2965071