我正在解析一个文件并希望将一些数据添加到地图中,以便稍后我可以参考它,但我已经调试过并注意到这些元素没有像我期望的那样被添加至。如果有人可以指出问题,因为我对C ++很新,并且通常使用不同语言的地图。
std::map<const char *, const char*> MaterialParser::parseMaterial(const char * path) {
std::map<const char *, const char *> materialMap;
std::pair<const char *, const char *> pair;
ifstream inFile;
inFile.open(path);
if (!inFile.good()) {
std::cout << "Unable to open material file" << endl;
return materialMap;
}
string materialName;
while (!inFile.eof()) {
string line;
getline(inFile, line);
if (line.substr(0, 6) == "newmtl") {
materialName = line.substr(7);
}
else if (line.substr(0,3) == "map") {
string dir = line.substr(7);
//pair.first = materialName.c_str();
//pair.second = dir.c_str();
//materialMap.insert(pair);
materialMap[materialName.c_str()] = dir.c_str();
}
}
stringstream ss;
ss << "MaterialData loaded. Size: " << materialMap.size() << endl;
OutputDebugStringA(ss.str().c_str());
inFile.close();
return materialMap;
}
我已经尝试在添加到地图时打印输出,并且在文档中有多个元素时,每次大小只有1。我打印出数据并正确阅读,只是没有添加到地图中。有人可以告诉我为什么好吗?
输出:
Adding material: Body_MiddlePath: assets\textures\plane\Body mid.dds Size: 1
Adding material: Body_Parts_1 Path: assets\textures\plane\Body Par.dds Size: 1
Adding material: Parts_11 Path: assets\textures\plane\parts 1.dds Size: 1
Adding material: Body_rear Path: assets\textures\plane\body rea.dds Size: 1
Adding material: body_front Path: assets\textures\plane\body fro.dds Size: 1
Adding material: Wing_Detail Path: assets\textures\plane\wing det.dds Size: 1
Adding material: Body_Tail Path: assets\textures\plane\body tai.dds Size: 1
Adding material: Wing_Right Path: assets\textures\plane\wing rig.dds Size: 1
Adding material: Wing_Left Path: assets\textures\plane\wing lef.dds Size: 1
Adding material: interior_1 Path: assets\textures\plane\interior.dds Size: 1
Adding material: body_parts_2 Path: assets\textures\plane\Body Par.dds Size: 1
Adding material: Glass Path: assets\textures\plane\glass 1.dds Size: 1
已加载MaterialData。大小:1
答案 0 :(得分:7)
使用std::map<std::string, std::string>
代替std::map<const char *, const char*>
。
问题是,您从materialName.c_str()
获得并以const char *
的形式存储到地图中的值得到了&#34;未定义&#34;在函数结束时销毁materialName
之后,您将使用新值重写已存储在地图中的const char *
内存。
另一个问题是const char *
只是一个数字(指向内存的指针),当作为键插入到地图时,它只是作为数字而不是字符串进行比较。因为数字(指针)可能总是相同(在堆栈中的相同位置),所以地图只用一个键填充。