C OS X将目录内容读入字符串数组
我正在尝试获取目录的内容。理想情况下,我希望将它们存储在字符串数组中。在c中,除了打开目录、迭代目录内容并在运行时填充数组之外,还有其他方法可以做到这一点吗C OS X将目录内容读入字符串数组,c,macos,directory,osx-mavericks,C,Macos,Directory,Osx Mavericks,我正在尝试获取目录的内容。理想情况下,我希望将它们存储在字符串数组中。在c中,除了打开目录、迭代目录内容并在运行时填充数组之外,还有其他方法可以做到这一点吗 我正在一个运行OS X 10.9的系统上工作,您可能希望使用system libc call和fopen运行 这是示例代码,注意所有数组长度,这里没有进行验证。 #包括 #包括 #包括 int main(int argc, char* argv[]) { char cmd[254] = "ls "; char arr[1
我正在一个运行OS X 10.9的系统上工作,您可能希望使用system libc call和fopen运行 这是示例代码,注意所有数组长度,这里没有进行验证。 #包括 #包括 #包括
int
main(int argc, char* argv[])
{
char cmd[254] = "ls ";
char arr[1024];
char line[254];
FILE *fp;
if(argc < 2) return -1;
if(argv[1]) strcat(cmd, argv[1]);
strcat(cmd, " > /tmp/out");
system(cmd);
fp = fopen("/tmp/out", "r");
if(!fp){
perror("");
return fprintf(stderr, "could not open /tmp/out!\n");
}
while(fgets(line, 254, fp) != NULL) {
strcat(arr, line);
}
printf("%s\n", arr);
return 0;
}
int
main(int argc,char*argv[])
{
char cmd[254]=“ls”;
char-arr[1024];
字符行[254];
文件*fp;
如果(argc<2)返回-1;
if(argv[1])strcat(cmd,argv[1]);
strcat(cmd,“>/tmp/out”);
系统(cmd);
fp=fopen(“/tmp/out”,“r”);
如果(!fp){
佩罗尔(“”);
返回fprintf(stderr,“无法打开/tmp/out!\n”);
}
while(fgets(第254行,fp)!=NULL){
strcat(arr,线路);
}
printf(“%s\n”,arr);
返回0;
}
您可能希望使用系统libc call和fopen运行
这是示例代码,注意所有数组长度,这里没有进行验证。
#包括
#包括
#包括
int
main(int argc, char* argv[])
{
char cmd[254] = "ls ";
char arr[1024];
char line[254];
FILE *fp;
if(argc < 2) return -1;
if(argv[1]) strcat(cmd, argv[1]);
strcat(cmd, " > /tmp/out");
system(cmd);
fp = fopen("/tmp/out", "r");
if(!fp){
perror("");
return fprintf(stderr, "could not open /tmp/out!\n");
}
while(fgets(line, 254, fp) != NULL) {
strcat(arr, line);
}
printf("%s\n", arr);
return 0;
}
int
main(int argc,char*argv[])
{
char cmd[254]=“ls”;
char-arr[1024];
字符行[254];
文件*fp;
如果(argc<2)返回-1;
if(argv[1])strcat(cmd,argv[1]);
strcat(cmd,“>/tmp/out”);
系统(cmd);
fp=fopen(“/tmp/out”,“r”);
如果(!fp){
佩罗尔(“”);
返回fprintf(stderr,“无法打开/tmp/out!\n”);
}
while(fgets(第254行,fp)!=NULL){
strcat(arr,线路);
}
printf(“%s\n”,arr);
返回0;
}
您可以使用POSIX函数获得已分配的目录列表,该函数采用路径和可选的筛选和排序回调,并返回一个dirent
结构数组。OSX还提供了一种接收块而不是回调来进行排序和筛选的方法
int scandir(const char *dirname, struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
仅检索未排序的条目列表非常简单:
int num_entries;
struct dirent **entries = NULL;
num_entries = scandir("/", &entries, NULL, NULL);
for(int i = 0; i < num_entries; i++)
puts(entries[i]->d_name);
//entries is ours to free
for(int i = 0; i < num_entries; i++)
free(entries[i]);
free(entries);
<代码>int num_条目;
struct dirent**entries=NULL;
num_entries=scandir(“/”,&entries,NULL,NULL);
对于(int i=0;ialphasort
作为最后一个参数
小心scandir返回错误(-1)。上述代码的结构不需要显式检查,但在更详细的使用中可能不可能进行这种检查。您可以使用POSIX函数获得分配的目录列表,该函数采用路径和可选的筛选和排序回调,并返回一组
dirent
结构。OSX还提供了一种接收块而不是回调来进行排序和筛选的方法
int scandir(const char *dirname, struct dirent ***namelist,
int (*select)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
仅检索未排序的条目列表非常简单:
int num_entries;
struct dirent **entries = NULL;
num_entries = scandir("/", &entries, NULL, NULL);
for(int i = 0; i < num_entries; i++)
puts(entries[i]->d_name);
//entries is ours to free
for(int i = 0; i < num_entries; i++)
free(entries[i]);
free(entries);
int num\u条目;
struct dirent**entries=NULL;
num_entries=scandir(“/”,&entries,NULL,NULL);
对于(int i=0;id_名称);
//参赛作品由我们免费提供
对于(int i=0;i
POSIX还提供了一个预先制作的排序功能,可与scandir一起用于按字母顺序排序。要使用它,只需传递alphasort
作为最后一个参数
小心scandir返回错误(-1)。上述代码的结构不需要显式检查,但在更复杂的用途中可能不可能