在windows上将filesystem::path转换为char*
Convert filesystem::path into char* on windows
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()
获得的指针——就像上面的例子一样——不会比它指向的字符串更长寿…
相关文章:
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将函数参数"const char*"转换为"std::string_view"是
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 如何在虚幻引擎4中将char*转换为TCHAR?
- C++:将模板类型 char 转换为 std::string
- strcmp/char* 转换无法按预期工作
- C++中的SQLite char*转换
- 无法从 const char* 转换为 const char *&
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 试图使用strCMP时的char转换错误
- 无法从'const char *'转换为'LPCTSTR'
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- 使用 static_cast 将 char 转换为 int c++
- 如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
- 无法将const char转换为字符串构造字符串