Vin*_*ent 23 c c++ filesystems file c++11
我想写一个函数:
inline char separator()
{
/* SOMETHING */
}
Run Code Online (Sandbox Code Playgroud)
在标准C/C++/C++ 11中返回系统的文件分隔符?(我的意思是斜杠或反斜杠取决于系统).有没有办法实现这个目标?
sim*_*onc 38
除了通过检查ifdef,我不知道该怎么做
inline char separator()
{
#ifdef _WIN32
return '\\';
#else
return '/';
#endif
}
Run Code Online (Sandbox Code Playgroud)
或(由PaperBirdMaster建议)
const char kPathSeparator =
#ifdef _WIN32
'\\';
#else
'/';
#endif
Run Code Online (Sandbox Code Playgroud)
Dav*_* C. 12
这个问题真的暗示了一个更糟糕的问题.
如果您只关心UNIX与Winodws并且只关心目录和文件,那么您已经看到的(大多数)将会工作,但是将路径名拼接到其组件中的更通用的问题是一个更加丑陋的问题.根据平台,路径可能包括以下一项或多项:
虽然有第三方库(比如各种CPAN Perl模块,Boost等),并且每个操作系统都包含系统功能,但是没有内置于C的C++标准只能获得此功能(通过合并) 2017年的Boost模块).
这种功能可能需要处理的一些例子是:
还有很多其他的.
值得注意的是,C++ 17文件系统库并未涵盖所有这些可能性.它std::filesystem::path由可选的根名称(卷标识符),可选的根目录(用于标识绝对路径)和由目录分隔符分隔的文件名序列组成.这涵盖了在UNIX平台上可能有效的所有内容以及其他平台的大多数用例,但并不全面.例如,它没有任何子流支持(依靠操作系统以某种方式将它们映射到文件名 - 这是由Mac OS X完成的,但不是经典的MacOS).它也不包括对文件版本号的支持.
另请参阅Wikipedia在Path和C++ 17 std :: filesystem :: path类上的条目
http://en.cppreference.com/w/cpp/filesystem
我建议您查看目标分隔符要执行的操作(提取基本名称,将路径分解为目录列表等)并编写一个函数来执行此操作.如果您正在使用C++ 17(并且您确定您的代码不会被17之前的C++编译器编译),那么您可以(可能)使用标准C++库代码来编写此函数的可移植实现.如果没有,该功能将需要为#ifdef您将支持的每个平台使用特定于平台的s,#error如果没有满足任何条件,则使用它来强制您为意外平台添加条件.
或者使用包含所有这些功能的第三方库(如Boost),如果可以接受的话.
twi*_*wid 11
这可能是这样的
#if defined(WIN32) || defined(_WIN32)
#define PATH_SEPARATOR "\\"
#else
#define PATH_SEPARATOR "/"
#endif
Run Code Online (Sandbox Code Playgroud)
小智 6
接受的答案在Cygwin下不起作用.在Windows上运行的Cygwin编译程序可以使用Windows样式的'\'分隔符,但它没有定义_WIN32等.在Cygwin下运行的修改后的解决方案:
inline char separator()
{
#if defined _WIN32 || defined __CYGWIN__
return '\\';
#else
return '/';
#endif
}
Run Code Online (Sandbox Code Playgroud)
要么
const char kPathSeparator =
#if defined _WIN32 || defined __CYGWIN__
'\\';
#else
'/';
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35079 次 |
| 最近记录: |