我正在解析一个文件,并希望将一些数据添加到地图中,以便我可以稍后引用它,但我一直在调试,并注意到这些元素没有像我期望的那样添加.如果有人可以指出问题,因为我对C++很新,并且通常使用不同语言的地图.
std::mapMaterialParser::parseMaterial(const char * path) { std::map materialMap; std::pair 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
用std::map
而不是std::map
.
问题是,在函数结束时销毁后,您从materialName.c_str()
地图中const char *
获取并存储到的值只是"未定义" materialName
,因此您将const char *
使用新值重写已存储在地图中的内存.
另一个问题是它const char *
只是一个数字(指向内存的指针),当作为键插入到地图时,它只是作为数字而不是字符串进行比较.因为数字(指针)可能总是相同(在堆栈中的相同位置),所以地图只用一个键填充.