如何获取txt文件中的图像路径的根文件夹名称

问题描述:

我在C++中有一个关于获取由“\”分隔的名称的问题。我有一个存储图像和标签(只是1,2 ......)的完整路径,例如文本文件作为如何获取txt文件中的图像路径的根文件夹名称

Image_align\Russian\1.jpg;1 
Image_align\USA\2.jpg;1 
Image_align\China\3.jpg;2 

我想要得到的图像名称和它的根文件夹名称。例如。我有图像'1.jpg',其根文件夹是'俄罗斯'。我做了一些事情,我做了一些文件名。现在,我仍然是它的根文件夹。你能让我通过C++找到它吗?预先感谢

这是我的代码,我试图

std::ifstream 
file("database.txt"); 
char separator = ';'; //Filename and label separate by ";" 
string imagepath; //'Image_align\Russian\1.jpg' 
string label; 
while (std::getline(file, content)) 
{ 
stringstream liness(content); 
getline(liness, imagepath, separator); 
Mat image = imread(imagepath); 
const size_t last_slash_idx = imagepath.find_last_of("\\/"); 
if (std::string::npos != last_slash_idx) 
{ 
    imagepath.erase(0, last_slash_idx + 1); 
} 
string imagename=imagepath; 
//Now I want to get the its root folder such as 'Russia', 'USA'.. 
+0

为什么不使用POSIX功能基名和目录名? – stark

+0

@stark我没有该代码的专家。因此,我只是解析这个名字。 – Jame

我投球标记者

void multiparse(string overtoken, vector<string> &tokens, const char * delims) 
{ 
    stringstream ss(overtoken); 
    string token; 
    while (getline(ss, token, delims[0])) 
    { 
     if (delims[1] == '\0' || token.length() == 0) 
     { 
      tokens.push_back(token); 
     } 
     else 
     { 
      multiparse(token, tokens, &delims[1]); 
     } 
    } 
} 

使用一个稍微聪明:

while (std::getline(file, content)) 
{ 
    stringstream liness(content); 
    getline(liness, imagepath, separator); 
    Mat image = imread(imagepath); 
    vector<string> tokens; 
    multiparse(imagepath, tokens, "/\\"); 
    string imagename; 
    string rootfolder; 
    if (tokens.size() >= 2) 
    {  
     vector<string>::iterator it = tokens.end(); 
     --it; 
     imagename = *it; 
     --it; 
     rootfolder = *it; 
     // do stuff 
    } 
    else 
    { 
     cerr << "Parsed bad line" << endl; 
     // appropriate failure response 
    } 
} 

如果您的项目可以使用Win32 API的,PathRemoveFileSpec应该是很长的路要走。

+0

谢谢,我试过了,但它不起作用\t char * cstr = new char [imagepath.length()+ 1]; strcpy(cstr,imagepath.c_str()); \t PathRemoveFileSpec(cstr); – Jame