我有一个目标路径和一个文件名作为字符串,我想用c++连接它们。有没有办法做到这一点,让程序/编译器在/和\之间选择windows或unix系统?
kx1ctssn1#
如果你想在编译时完成它,你当然可以这样做
#ifdef WIN32 #define OS_SEP '\\' #else #define OS_SEP '/' #endif
或者你可以只使用“/”,在windows上一切都很好(除了旧的程序解析字符串,只使用“\”),只有这样显示给用户时才看起来很有趣。
anauzrmj2#
正如经常出现的情况一样,Boost有一个库可以做你想做的事情。Here是一个教程。
mjqavswn3#
在内部任何地方使用“/”。然后编写一组实用函数,使用“/”将任一形式的路径导入。编写一个“native path”函数,该函数具有系统特定的ifdef和必要的转换。可以根据需要调用。
kx1ctssn4#
一种简单的方法是使用一个小的(可能是内联的)函数,该函数使用预处理器魔术来确定平台(#ifdef WIN32等)并返回适当的分隔符。答案有点复杂,因为除了分隔符之外,还有其他更重要的区别。Windows文件系统可以有多个根目录(C:\,D:\,等等),而整个文件系统的根目录都是/。最好的建议可能是使用boost::filesystem。
#ifdef WIN32
boost::filesystem
lokaqttq5#
/
std::filesystem::path::preferred_separator
std::filesystem::path
operator/=
std::filesystem::path myPath = "abc/def"; myPath /= "hij"; // after a slash myPath += "klm"; // no slash prepended std::cout << myPath.c_str() << '\n';
结局:abc/def/hijklm
abc/def/hijklm
5条答案
按热度按时间kx1ctssn1#
如果你想在编译时完成它,你当然可以这样做
或者你可以只使用“/”,在windows上一切都很好(除了旧的程序解析字符串,只使用“\”),只有这样显示给用户时才看起来很有趣。
anauzrmj2#
正如经常出现的情况一样,Boost有一个库可以做你想做的事情。Here是一个教程。
mjqavswn3#
在内部任何地方使用“/”。然后编写一组实用函数,使用“/”将任一形式的路径导入。编写一个“native path”函数,该函数具有系统特定的ifdef和必要的转换。可以根据需要调用。
kx1ctssn4#
一种简单的方法是使用一个小的(可能是内联的)函数,该函数使用预处理器魔术来确定平台(
#ifdef WIN32
等)并返回适当的分隔符。答案有点复杂,因为除了分隔符之外,还有其他更重要的区别。Windows文件系统可以有多个根目录(C:\,D:\,等等),而整个文件系统的根目录都是/。
最好的建议可能是使用
boost::filesystem
。lokaqttq5#
/
可移植(适用于XP之后的Windows)1.为了安全起见,从C++17开始:
std::filesystem::path::preferred_separator
,成员常量。参见:https://en.cppreference.com/w/cpp/filesystem/path
使用
std::filesystem::path
对象。操作如同处理字符串一样完成。可以通过operator/=
进行连接例如,
结局:
abc/def/hijklm