繁体   English   中英

队列未返回正确的值

[英]Queue doesn't return correct values

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

因此,想法如下:我有一个函数可以递归地打印目录的内容,可以正常工作,但是现在我试图将每个条目保存在队列中,稍后将用于处理某些事情。其他。 令人讨厌的部分是,我将每个条目(来自dirent结构的d_name )推入该函数的队列中,如果我直接在函数末尾打印队列的内容,它会返回正常值,但是如果我打印出结果在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);
}

而且,如果我在closedir之后立即打印queue的内容,我会得到一个很好的结果,如下所示:

DummyDir2
DummyDir6
DummyDir7
DummyDir5
DummyDir12
DummyDir11
DummyDir3 
DummyDir8
DummyDir4
DummyDir9
DummyDir10

但是,如果我在main打印队列的内容,则会得到以下信息:

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

我似乎真的不明白为什么要这样做,所以如果您能帮助我,我将不胜感激。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM