【问题标题】:filesystem value_type pointer to string?文件系统 value_type 指向字符串的指针?
【发布时间】: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+ 连接。
  • “不起作用” - 是一个糟糕的问题描述。您应该准确地描述问题。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c++ string


【解决方案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/ 来为您处理差异。
猜你喜欢
  • 1970-01-01
  • 2013-04-26
  • 2011-04-12
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
相关资源
最近更新 更多