2015-06-20 134 views
0

我在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

回答

2

我投球標記者

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 
    } 
} 
1

如果您的項目可以使用Win32 API的,PathRemoveFileSpec應該是很長的路要走。

+0

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

相關問題