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

Convert filesystem::path into char* on windows

本文关键字:char 转换 path 上将 filesystem windows      更新时间:2023-10-16

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

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

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

我在目录上迭代

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

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

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

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

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

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

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