C++中如何从路径字符串中获取文件名!

如题,最好是能直接从标准库的字符串中获取,实在没有其他的也行...

如图,路径字符串,一个std::string path;怎么冲path中获取 world或者world.shp

C风格:

char *p = strrchr(path.c_str(), '/')

p是path里最后一个'/'的地址。然后

string s(p + 1);

,s就是"world.shp"了。


C++风格:

int pos = path.find_last_of('/');

pos就是最后一个'/'的下标。

然后

string s(path.substr(pos + 1) );

s就是"world.shp"了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-08
//将字符串根据给定分隔符分割成多个子字符串
//strLine 要分割的字符串
//cDelimiter 分割字符
//strArray string数组用来存放分割好的字符串
int ParseSubStrByDelimiter(string strLine, char cDelimiter, string* strArray)
{
    int nSeparator = -1;
    int nNextSeparator = -1;
    int nStrLen = strLine.length();
    int nStrArraySize = 0;
    int i = 0;
    
    //strLine replace '\t' to ' '
int nIndex = strLine.find('\t', 0);
while(nIndex >= 0)
{
strLine.replace(nIndex, 1, " ");
nIndex = strLine.find('\t', 0);
}

int nCommaPos = strLine.find(',');
    int nSemicolonPos = strLine.find(';');
    if (nCommaPos < 0 && nSemicolonPos < 0)
    {
        cDelimiter = '/';
    }
 
    switch (cDelimiter)
    {
    case '/ ':
        for (i = 0; i < nStrLen;)
        {
            if (strLine.at(i) != cDelimiter)
            {
                nSeparator = i;
                nNextSeparator = strLine.find(cDelimiter, nSeparator + 1);
                if (nNextSeparator < 0)
                {
                    strArray[nStrArraySize++] = strLine.substr(nSeparator, nStrLen - 1);
                    break;
                }
                strArray[nStrArraySize++] = strLine.substr(nSeparator, nNextSeparator-nSeparator);
                
                i = nNextSeparator;
                if (i >= nStrLen)
                {
                    break;
                }
            }
            else
            {
                i++;
            }
        }
        break;
        
    case ',':
    case ';':
        for (i = 0; i < nStrLen;)
        {
            if (i == 0)
            {
                if (strLine.at(i) == cDelimiter)
                {
                    strArray[nStrArraySize++] = "";
                    nSeparator = i;
                }
                else
                {
                    nSeparator = strLine.find(cDelimiter, nSeparator + 1);
                    if (nSeparator < 0)
                    {
                        break;
                    }
                    strArray[nStrArraySize++] = strLine.substr(0, nSeparator);
                }
                
                i = nSeparator;
            }
            else
            {
                nSeparator = i;
                nNextSeparator = strLine.find(cDelimiter, nSeparator + 1);
                if (nNextSeparator < 0)
                {
                    strArray[nStrArraySize++] = strLine.substr(nSeparator + 1, nStrLen - nSeparator - 1);
                    break;
                }
                
                if (nNextSeparator == nSeparator + 1)
                {
                    strArray[nStrArraySize++] = "";
                }
                else
                {
                    strArray[nStrArraySize++] = strLine.substr(nSeparator + 1, nNextSeparator - nSeparator - 1);
                }
                
                i = nNextSeparator;
            }
        }
        break;
    default:
        break;
    }
    return nStrArraySize;
}

对于你这个字符串而言这么用

string strArray[15];

int Arraysize= ParseSubStrByDelimiter(strline,'/',strArray);

strArray[Arraysize-1]就是你要的

第2个回答  2014-01-08
PathFindFileName("D:\OSGEarth2.4/data/world.shp") 可以直接返回 world.shp
第3个回答  2014-01-08
find_last_of("/") + substring()
相似回答