好吧,首先我不想使用Boost或任何外部库。 我只想使用C ++标准库 。 我可以使用split()
函数轻松地将string与给定的分隔符split()
:
void split(std::string &string, std::vector<std::string> &tokens, const char &delim) { std::string ea; std::stringstream stream(string); while(getline(stream, ea, delim)) tokens.push_back(ea); }
我这样做的文件名。 但是有一个问题。 有一些文件的扩展名是: tar.gz
, tar.bz2
等。还有一些文件名有额外的点。 Some.file.name.tar.gz
我希望分开Some.file.name
和tar.gz
注意:文件名中的点数不是恒定的。
我也试过PathFindExtension
但没有运气。 这可能吗? 如果是这样,请赐教。 谢谢。
编辑:我很抱歉没有指定操作系统。 这是Windows。
我想你可以使用std::string
find_last_of
来获取最后的索引.
和substr
切割字符串(尽管涉及多个点的“复杂扩展名”将需要额外的工作)。
没有办法做你想做的事,不涉及你的目的的扩展数据库。 没有任何关于扩展名的神奇功能,它们只是文件名的一部分(如果你是gunzip foo.tar.gz
你可能会得到一个foo.tar,所以对于这个应用程序.gz实际上是“扩展名”)。 所以,为了做你想做的事情,建立一个你想查找的扩展名的数据库,如果没有找到,就退回到“last dot”。
在C ++标准库中没有任何东西,也就是说它不在标准中,但是我所知道的每个操作系统都以各种方式提供了这个功能。
在Windows中可以使用_splitpath(),而在Linux中可以使用dirname()和basename()
问题确实是文件名,如*.tar.gz
,由于(至少在Windows中) .tar
部分不是扩展的一部分,所以不能一致地分割。 你必须为这些特殊情况保留一个列表,并使用一个点string::rfind
作为休息,或者找到一些预先实现的方式。 请注意, .tar.*
扩展名不是无限的,而且非常标准化(我认为其中大约有十个)。
您可以创建一个您认为可能遇到的文件扩展名的查找表。 如果遇到任何新问题,也可以添加一个命令行选项,将新的添加到查找表中。 然后通过文件名来解析查看表中的任何条目是否是文件名中的子字符串。
编辑:你也可以参考这个问题: C ++ / STL字符串:如何模仿正则表达式像通配符函数?