首页 > 解决方案 > 在 Windows 上将 filesystem::path 转换为 char*

问题描述

C++17 文件系统基于boost.filesystem。

我现在在带有 VS2017 的 Windows 上使用它。

#include <filesystem>
namespace fs = std::experimental::filesystem;

我遍历一个目录

for (auto& p: fs::directory_iterator("media"))

我想将路径传递给一个将文件路径作为const char *

我在这里发现了一个关于 boost 文件系统的类似问题。一个核心区别是C++17 中的路径基于value_type. 在哪里

value_type:文件系统的本机编码使用的字符类型:POSIX 上的 char,Windows 上的 wchar_t

所以我得到的是一个const wchar_t *字符串。

以下对我来说“有效”:

    char file[2000];
    wcstombs(file, p.path().c_str(), 2000);
    auto image = SDL_LoadBMP(file);

我正在寻找一个不同的版本,因为这个实现是各种各样的混乱(衰减数组到指针和_CRT_SECURE_NO_WARNINGS)。

我正在寻找一个更漂亮的版本,它可以直接从路径转到const char *在 Windows 上使用新的 C++17 文件系统。

这是我用来探索这个的 SDL2 项目。

#define _CRT_SECURE_NO_WARNINGS 1
#include <SDL.h>
#include <vector>
#include <filesystem>
namespace fs = std::experimental::filesystem;

int main(int argc, char* argv[])
{
    SDL_Init(SDL_INIT_EVERYTHING);
    auto window = SDL_CreateWindow("Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 400, SDL_WINDOW_SHOWN);
    auto scrrenSurface = SDL_GetWindowSurface(window);

    auto images = std::vector<SDL_Surface*>();

    for (auto& p: fs::directory_iterator("media"))
    {
        char file[2000];
        wcstombs(file, p.path().c_str(), 2000);
        auto image = SDL_LoadBMP(file);
        images.push_back(image);
    }

    for (auto&image : images)
    {
        SDL_BlitSurface(image, NULL, scrrenSurface, NULL);
        SDL_UpdateWindowSurface(window);
        SDL_Delay(2000);
    }

    for (auto&image : images)
        SDL_FreeSurface(image);

    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

编辑:在评论部分有一个类似的问题链接所以问题 那个问题是同一核心问题的不同表现形式,它将路径转换为可以被另一种方法使用的格式。我反对删除这个问题,因为两者都是通过不同的搜索找到的。

标签: c++c++17

解决方案


您可以使用对象的*string()generic_*string()成员函数std::filesystem::path将路径转换为本机或通用(即 POSIX 样式)字符串。例如:

SDL_LoadBMP(p.path().string().c_str());

请注意,这些方法返回一个std::basic_string<T>值。因此,必须确保,例如,通过.c_str()直接调用返回值获得的指针(如上例所示)不会超过它指向的字符串……</p>


推荐阅读