在Windows上将filesystem :: path转换为char*

Joh*_*nes 1 c++ c++17

C++ 17的文件系统是基于Boost.Filesystem的.

我现在正在Windows上使用VS2017.

#include <filesystem>
namespace fs = std::experimental::filesystem;
Run Code Online (Sandbox Code Playgroud)

我遍历一个目录

for (auto& p: fs::directory_iterator("media"))
Run Code Online (Sandbox Code Playgroud)

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

我在这里找到了一个关于boost文件系统的类似问题.核心差异在于C++ 17中的路径基于a 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);
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个不同的版本,因为这个实现是各种乱码(衰减数组到指针和_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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:在评论部分有一个相关问题链接的问题 - 问题是同一个核心问题的不同表现形式,即将路径转换为可由另一个方法使用的格式.我会反对删除这个问题,因为在不同的搜索中找到了这两个问题.

Mic*_*zel 5

您可以使用*string()generic_*string()该成员函数std::filesystem::path对象将路径转换成无论是本地或通用(即POSIX风格)的字符串.例如:

SDL_LoadBMP(p.path().string().c_str());
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,返回的字符串是临时的,因此将在完整表达式的末尾销毁.假设SDL不存储指针供以后使用,这段代码可能没问题,但是应该向未来的访问者说明存储`string().c_str()`以供以后使用将无效. (3认同)