文件系统 value_type 指向字符串的指针?
Posted
技术标签:
【中文标题】文件系统 value_type 指向字符串的指针?【英文标题】:filesystem value_type pointer to string? 【发布时间】:2021-08-29 18:57:29 【问题描述】:我有一个directory_iterator
,我想要文件名,但我似乎无法正常工作,它只是抛出一个错误,指出value_type*
无法转换为string
。
我无法将其转换为字符串,std::to_string()
也不起作用!
for (auto& p : std::experimental::filesystem::directory_iterator(dir))
auto path = p.path().filename().c_str();
//this doesn't work
std::ifstream comp("Json/" + path, std::ifstream::binary);
//neither does this
char f[50] = "Json/";
std::strcpy(f, path);
std::ifstream comp(f, std::ifstream::binary);
【问题讨论】:
您不能将 C 字符串与operator+
连接。
“不起作用” - 是一个糟糕的问题描述。您应该准确地描述问题。
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
【参考方案1】:
range-for
循环使用迭代器枚举元素序列,在每次循环迭代时取消引用迭代器以访问序列中的下一个元素。
当filesystem::directory_iterator
被取消引用时,它会产生一个filesystem::directory_entry
,它有一个path()
方法(和一个转换运算符)用于检索条目所代表的filesystem::path
。
在您的示例中,p.path().filename()
返回一个新的 filesystem::path
,然后其 c_str()
方法在 Posix 系统上返回 const char*
,在 Windows 上返回 const wchar_t*
。您不能使用+
运算符将const char[]
(来自字符串文字"Json/"
)与const char*
或const wchar_t*
连接起来。而strcpy()
应该是strcat()
,否则您将覆盖您初始化f
的"Json/"
。而且你不能从const wchar_t*
构造std::string
(但你可以从const char*
构造)。
但是,filesystem::path
有一个 operator/
用于连接 2 个路径段,它们之间有一个适合平台的分隔符。
而std::ifstream
(和std::ofstream
)有一个接受filesystem::path
的构造函数。
所以,试试类似的方法:
for (auto& p : std::experimental::filesystem::directory_iterator(dir))
auto path = p.path().filename(); // NOTE: not c_str()!
std::ifstream comp("Json" / path, std::ifstream::binary);
如果你想要一个字符串格式的路径,filesystem::path
提供了几种返回各种字符串编码的方法,例如:
for (auto& p : std::experimental::filesystem::directory_iterator(dir))
auto path = p.path().filename().string(); // NOTE: not c_str()!
std::ifstream comp("Json/" + path, std::ifstream::binary);
【讨论】:
如果我想使用 ifstream,它是从文件所在的位置开始还是从 C:\ 开始,而且它是使用 \ 还是 /? @SomeRandomCoderJson/filename
是相对路径,因此它会相对于调用进程的工作目录打开文件。至于/
与\
,这取决于平台。这就是为什么您应该使用filesystem::path
及其operator/
来为您处理差异。以上是关于文件系统 value_type 指向字符串的指针?的主要内容,如果未能解决你的问题,请参考以下文章