文件系统 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:\ 开始,而且它是使用 \ 还是 /? @SomeRandomCoder Json/filename 是相对路径,因此它会相对于调用进程的工作目录打开文件。至于/\,这取决于平台。这就是为什么您应该使用filesystem::path 及其operator/ 来为您处理差异。

以上是关于文件系统 value_type 指向字符串的指针?的主要内容,如果未能解决你的问题,请参考以下文章

文件内容操作

汇编中用啥命令代码来获取函数的返回值?

函数指针与指针函数

指向动态二维字符数组的三重指针的内存分配

STL迭代器

在 GDB 中取消引用双指针(指向值的指针)