队列未返回正确的值

时间:2019-03-20 21:14:15

标签: c++ queue

所以,基本上我正在分配作业,但这不是实际的问题。作业要求我使用一个列表,到目前为止,还不错。

因此,思路如下:我有一个函数可以递归地打印目录的内容,可以正常工作,但是现在我试图将每个条目保存在队列中,稍后我将用于其他用途。令人讨厌的部分是,我将每个条目(来自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 个答案:

答案 0 :(得分:2)

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));