Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OS X将目录内容读入字符串数组_C_Macos_Directory_Osx Mavericks - Fatal编程技术网

C OS X将目录内容读入字符串数组

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

我正在尝试获取目录的内容。理想情况下,我希望将它们存储在字符串数组中。在c中,除了打开目录、迭代目录内容并在运行时填充数组之外,还有其他方法可以做到这一点吗


我正在一个运行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;id_名称); //参赛作品由我们免费提供 对于(int i=0;i POSIX还提供了一个预先制作的排序功能,可与scandir一起用于按字母顺序排序。要使用它,只需传递
alphasort
作为最后一个参数


小心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)。上述代码的结构不需要显式检查,但在更复杂的用途中可能不可能