2017-02-16 36 views
0

Пусть у меня есть следующие абстракции кода:C Каталог Traverse и печать Записи в пар

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 линий, в том числе линий только фигурные скобки на них)

#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; 
} 

(функции объявлены в stderr.h все начинают err_ и значительно упростить вы можете найти их код на GitHub по адресу https://github.com/jleffler/soq/tree/master/src/libsoq.)

 Смежные вопросы

  • Нет связанных вопросов^_^