2017-02-16 62 views
0

假设我有以下的代码抽象:ç遍历目录和打印项在双

DIR *d; 
    struct dirent *sd; 
    d = opendir("SOME DIRECTORY"); 
    // handle errors 
    sd = readdir(d); 
    while(sd != NULL){ 
    printf("(%s, %s)\n", sd->d_name, sd->the_next_d_name); 
    sd = readdir(d); 
    } 
    closedir(dir); 

我有点新的C和进入详细页面man。我只是想了解如何在循环体中访问目录的两个条目。代码使用一些伪名称来表达想法。此外,如果有奇数条目,我希望最后一对具有与NULL

配对的条目无论如何,谢谢。

+0

不明确!更具体。写下你期望的输出结果并提及你想要做的事 – minigeek

+0

如果我的目录中有'a.txt','b.txt'和'c.txt',我想让代码打印'( a.txt,b.txt)\ n(c.txt,NULL)' – user2965071

回答

0

的主要问题是,当它被称为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。)