递归std :: stringstream和c_str

时间:2014-06-03 09:08:19

标签: c++ std

我已经实现了这个简单的功能,以便递归地清空文件夹(Xcode 5.1。目标平台iOS)。该函数为每个传递新目录路径的子目录调用自身。

但是在第一次递归调用后,path参数在再次调用opendir后归零。 path参数现在是一个空字符串,我无法弄清楚原因。 stringstream buf变量不会被销毁,AFAIK也不会被opendir更改。

提前感谢您的帮助。

void emptyFolder(const char *path) 
{
   if (DIR *folder = opendir(path)) {
       while (struct dirent *entry = readdir(folder)) {
           if (strcmp(entry->d_name,".") == 0 ||
               strcmp(entry->d_name,"..") == 0)
               continue;

        std::stringstream buf;
        buf << path << '/' << entry->d_name;
        const char *filepath = buf.str().c_str();

           if (entry->d_type == DT_DIR)
               emptyFolder(filepath);
           remove(filepath)
       }
       closedir(folder);
    }
}

1 个答案:

答案 0 :(得分:1)

正如n.m所说,你需要复制buf.str()的内容,否则你可以将引用直接传递给函数:

选项1:

std::string filepath(buf.str());
if (entry->d_type == DT_DIR)
  emptyFolder(filepath.c_str());
remove(filepath.c_str())

选项2:

if (entry->d_type == DT_DIR)
  emptyFolder(buf.str().c_str());
remove(buf.str().c_str())

我还建议您使用std::string而不是const char*的引用。在需要使用不支持字符串对象的API的地方直接使用c_str(),并避免缓存它们(如选项2中所示)。