Очередь не возвращает правильные значения - PullRequest
0 голосов
/ 21 марта 2019

Итак, в основном у меня есть задание, но проблема не в этом. Назначение требует от меня использовать список, что пока хорошо.

Итак, идея заключается в следующем: у меня есть функция, которая рекурсивно печатает содержимое каталога, которая работает нормально, но теперь я пытаюсь сохранить каждую запись в очереди, которую я позже собираюсь использовать для чего-то еще. Неприятная часть заключается в том, что я помещаю каждую запись (d_name из структуры dirent) в очередь в этой функции, и если я печатаю содержимое очереди непосредственно в конце функции, она возвращается нормально, но если я напечатаю результаты в main, я получу также мусор.

Итак, мои тестовые каталоги выглядят так:

-DummyDir
    -DummyDir2
         -DummyDir6
         -DummyDir7
    -DummyDir3
         -DummyDir8
    -DummyDir4
         -DummyDir9
         -DummyDir10
    -DummyDir5
         -DummyDir11
         -DummyDir12

Моя функция выглядит так:

void dirwrap(char* dir, std::queue<char*>* queue)
{
   DIR* dirOpen;

   if(!(dirOpen = opendir(dir))){
     printf("Couldn't open directory: %s\n", dir);
     exit(-1);
   }

   struct dirent* dd;
   char path[2000];

   while ((dd = readdir(dirOpen)) != NULL)
   {
      if (strcmp(dd->d_name, ".") != 0 && strcmp(dd->d_name, "..") != 0) {

        //printf("%s\n", dd->d_name);
        queue->push(dd->d_name);        

        sprintf(path, dir, "%s", sizeof(dir));
        strcat(path, "/");
        strcat(path, dd->d_name);
        dirwrap(path, queue);
      }
  }
  closedir(dirOpen);
}

И если я напечатаю содержимое queue сразу после closedir, я получу хороший результат, например:

DummyDir2
DummyDir6
DummyDir7
DummyDir5
DummyDir12
DummyDir11
DummyDir3 
DummyDir8
DummyDir4
DummyDir9
DummyDir10

Но если я напечатаю содержимое своей очереди в main, я получу это:

DummyDir2
DummyDir9
DummyDir10
DummyDir5
8�)�W▒
.
DummyDir3
~n��w▒
DummyDir4
DummyDir9
DummyDir10

Я действительно не могу понять, почему на самом деле это делает, поэтому я был бы очень признателен, если бы вы мне помогли.

1 Ответ

2 голосов
/ 21 марта 2019

В

while ((dd = readdir(dirOpen)) != NULL)
{
   if (strcmp(dd->d_name, ".") != 0 && strcmp(dd->d_name, "..") != 0) {

     //printf("%s\n", dd->d_name);
     queue->push(dd->d_name);        

dd->d_name - это массив внутри возвращаемого значения, обычно:

     struct dirent {
          ino_t          d_ino;       /* Inode number */
          off_t          d_off;       /* Not an offset; see below */
          unsigned short d_reclen;    /* Length of this record */
          unsigned char  d_type;      /* Type of file; not supported
                                         by all filesystem types */
          char           d_name[256]; /* Null-terminated filename */
      };

вам необходимо продублировать его (например, strdup или использовать std :: string и т. Д.), Поскольку данные, возвращаемые readdir(), могут быть перезаписаны последующими вызовами readdir() для того же потока каталога, и он будет освобожден closedir

Вы находитесь в C ++, замените std::queue<char*>* queue на std::queue<std::string>* queue (или std::queue<std::string> & queue) или замените queue->push(dd->d_name); на queue->push(strdup(dd->d_name));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...