在Windows上将FileSystem::PATH转换为char* [英] Convert filesystem::path into char* on windows

查看:47
本文介绍了在Windows上将FileSystem::PATH转换为char*的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C++17 filesystem基于bost.filessystems。

我现在正在Windows和VS2017上使用它。

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

我遍历目录

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

我要将路径传递给一个函数,该函数将文件路径作为const char *

我发现了关于boost filesystem here的类似问题。 核心区别在于path in 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)。

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

这是我过去使用的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;
}

编辑: 在评论部分有一个链接的类似问题so-question 该问题是同一核心问题的不同表现,即将路径转换为另一种方法可以使用的格式。我反对删除此问题,因为两者的搜索方式不同。

POSIX

您可以使用*string()generic_*string()对象的generic_*string()成员函数将路径转换为本机或泛型(即推荐答案样式)字符串。例如:

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

这篇关于在Windows上将FileSystem::PATH转换为char*的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆