C++ - 拆分文件名和文件扩展名

Rue*_*uel 4 c++ windows string split

好的,首先我不想使用Boost或任何外部库.我只想使用C++标准库.我可以使用我的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);
}
Run Code Online (Sandbox Code Playgroud)

我在文件名上这样做.但是有一个问题.有些文件的扩展名如:tar.gz,tar.bz2等等.还有一些文件名有额外的点.Some.file.name.tar.gz.我想分开Some.file.nametar.gz 注意:文件名中的点数不是常数.

我也试过PathFindExtension但没有运气.这可能吗?如果是的话,请赐教.谢谢.

编辑:我很抱歉没有指定操作系统.这是Windows.

ice*_*ime 6

我认为你可以std::string find_last_of用来获取最后一个的索引.,并substr剪切字符串(虽然涉及多个点的"复杂扩展"将需要额外的工作).

  • @b1naryatr0phy,您可以执行 `find_last_of("/\\.")` 并检查它是否是一个 `.` 以防止您的示例。 (2认同)

eta*_*ion 5

没有办法做你想要的,不涉及扩展数据库的目的.扩展没有什么神奇之处,它们只是文件名的一部分(如果你gunzip foo.tar.gz有可能得到一个foo.tar,那么对于这个应用程序.gz实际上是"扩展名").因此,为了做你想做的事情,建立一个你想要寻找的扩展数据库,如果你找不到,可以回到"最后一个点".

  • +1为短语"为您的目的".一般文件名拆分几乎是不可能的; 而且不是很有用.(如果应用程序必须是可移植的,那么应该扩展"最后一个点"启发式以处理Unix隐藏文件,其名称以点开头.) (2认同)