gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:03:16 32 4
gpt4 key购买 nike

C++17 filesystem基于 boost.filesystem。

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

#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: character type used by the native encoding of the filesystem: char on POSIX, wchar_t on Windows

所以我得到的是一个 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该问题是同一核心问题的不同表现形式,即将路径转换为可由另一种方法使用的格式。我反对删除这个问题,因为通过不同的搜索可以找到这两个问题。

最佳答案

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

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

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

关于c++ - 在 Windows 上将 filesystem::path 转换为 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54109159/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com