将 dirent->d_name 与字符串一起使用失败
Using dirent->d_name together with string fails
我正在编写一个使用 dirent.h
库的 C++ 应用程序,以从目录中读取文件。有一次我想在文件和目录之间做出决定。为此,我添加了以下代码:
entry = readdir(used_directory); //read next object from directory stream
DIR* directory_test = opendir((path + entry->d_name).c_str()); //try to open object as directory
if ( directory_test != nullptr) { //object is directory
if (entry != nullptr) { //reading from directory succeeded
dirs.push_back(entry->d_name); //add filename to file list
++dircounter;
}
}
else { //object is file
path
是 string
的类型,条目是 dirent *
的类型。
这样,程序会导致内存访问错误,否则不会。
我想通了,错误是由
引起的
(path + entry->d_name)
但这不是语句中对string
的隐式转换,因为其他测试如cout << entry->d_name;
或path += entry->d_name
也失败并出现相同的错误。所以很明显,将 entry->d_name
用作 char *
是失败的,尽管它是这样定义的 (in the documentation of dirent.h).
为什么会出现此故障?
编辑:
稍后在程序中我将 entry->d_name
添加到 vector<string>
,这不会导致任何问题。
在检查条目是否等于 nullptr
之前访问条目失败。
因为如果条目等于 nullptr
,我在目录中的循环就会停止,最后一次迭代会导致错误。
我正在编写一个使用 dirent.h
库的 C++ 应用程序,以从目录中读取文件。有一次我想在文件和目录之间做出决定。为此,我添加了以下代码:
entry = readdir(used_directory); //read next object from directory stream
DIR* directory_test = opendir((path + entry->d_name).c_str()); //try to open object as directory
if ( directory_test != nullptr) { //object is directory
if (entry != nullptr) { //reading from directory succeeded
dirs.push_back(entry->d_name); //add filename to file list
++dircounter;
}
}
else { //object is file
path
是 string
的类型,条目是 dirent *
的类型。
这样,程序会导致内存访问错误,否则不会。
我想通了,错误是由
(path + entry->d_name)
但这不是语句中对string
的隐式转换,因为其他测试如cout << entry->d_name;
或path += entry->d_name
也失败并出现相同的错误。所以很明显,将 entry->d_name
用作 char *
是失败的,尽管它是这样定义的 (in the documentation of dirent.h).
为什么会出现此故障?
编辑:
稍后在程序中我将 entry->d_name
添加到 vector<string>
,这不会导致任何问题。
在检查条目是否等于 nullptr
之前访问条目失败。
因为如果条目等于 nullptr
,我在目录中的循环就会停止,最后一次迭代会导致错误。