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 :文件系统的本机编码使用的字符类型: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 这些问题是同一核心问题的不同体现,该问题正在将路径转换为另一种方法可以使用的格式。我不赞成删除此问题,因为两者都是通过不同搜索找到的。
答案 0 :(得分:5)
您可以使用*string()
对象的generic_*string()
和std::filesystem::path
成员函数将路径转换为本地或通用(即POSIX样式)字符串。例如:
init
请注意,这些方法返回一个SDL_LoadBMP(p.path().string().c_str());
值。因此,必须确保,例如,直接在返回值上调用std::basic_string<T>
所获得的指针(如上例所示)不会超过它指向的字符串的寿命……