为啥用c_str()转换路径类型后opendir()打不开路径?

Posted

技术标签:

【中文标题】为啥用c_str()转换路径类型后opendir()打不开路径?【英文标题】:Why won't opendir() open a path after converting the path type with c_str()?为什么用c_str()转换路径类型后opendir()打不开路径? 【发布时间】:2015-09-30 20:59:49 【问题描述】:

我正在尝试打开一个目录,其名称 (path) 当前位于最初从 .csv 文件读取的 std::string 中(尽管我不这么认为更改字符串本身的任何内容)。调用 opendir(path.c_str()) 返回 NULL。我尝试了以下代码,在 opendir() 之外进行转换:

DIR *dir;
bool first = True;
string level = "";
struct dirent *ent;

const char * c = path.c_str();
// A
if ((dir = opendir(c)) != NULL)
    // do stuff
    // should open the directory and go here
else
    // always ends up here

虽然由于 path="LeanDataBase" 失败,但项目文件夹中的一个目录,用 opendir("LeanDataBase") 代替 opendir(c) 似乎确实打开了该目录。但是,这个函数是递归的,所以我不能硬编码这个值,否则它不起作用并陷入无限循环。

我也尝试打印类型,在前面代码中的“A”之后插入以下两行:

cout << typeid(c).name() << endl;
cout << typeid("LeanDataBase").name() << endl;

产生以下输出:

PKc
A13_c

这是否意味着我将错误的类型传递给 opendir()?它似乎可以处理 PKc,但不能处理 A13_c。有没有办法将路径字符串转换为正确的类型?

【问题讨论】:

以及相关信息:调用时c(文本)值是多少?由于指定字符串有效(使用已知值),并且c 是正确的类型,因此可能的罪魁祸首是提供的实际值是..意外/不同。 心理预测:失败的字符串包括一个换行符和/或回车符,它位于读取它的文件中并且没有被剥离。 @ShadowRanger,让我们看看谁的预测是正确的......我感觉它是你的:) 根据这些心理预测,一些调试/故障排除提示:1) 在opendir() 调用之前添加类似printf("c is \"%s\"\n", c); 的内容。请注意字符串转储周围的引号,以便可以轻松检测到空格。 2) 发布重现您的问题的实际代码,这样path 超出范围或被更改之类的东西就不会被隐藏。和 3) 转储 errno 和/或使用 perror() 告诉您具体错误是什么。 @ShadowRanger,你明白了!我使用了this 示例来说明如何修剪空白,然后我就可以使用它了。谢谢! 【参考方案1】:

查看我的水晶球,我看到以下问题:在调用path.c_str() 之后,但在调用opendir() 之前修改路径(甚至离开范围)。在任何变量中记住 c_str() 的结果通常是一种不好的做法,因为它会导致这样的问题。 c_str() 用于就地使用,如下所示

opendir(path.c_str());

【讨论】:

以上是关于为啥用c_str()转换路径类型后opendir()打不开路径?的主要内容,如果未能解决你的问题,请参考以下文章

C++string类型与C语言字符数组的转换 std::string.c_str()函数

C++ 中怎么把string类型转换为float型或int型? C++处理字符串的方法似乎比较麻烦

string = 与strcpy的区别 c_str()

零碎知识

plsql导出cvs文件后数值为啥会变

Arduino char/char*/String数据类型转换