所以,基本上我正在分配作业,但这不是实际的问题。作业要求我使用一个列表,到目前为止,还不错。
因此,思路如下:我有一个函数可以递归地打印目录的内容,可以正常工作,但是现在我试图将每个条目保存在队列中,稍后我将用于其他用途。令人讨厌的部分是,我将每个条目(来自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
我似乎真的不明白为什么要这么做,所以如果您能帮助我,我将不胜感激。
答案 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));