如何获取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'..
答
我投球标记者
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
为什么不使用POSIX功能基名和目录名? – stark
@stark我没有该代码的专家。因此,我只是解析这个名字。 – Jame