为什么没有将元素添加到我的std :: map(C ++)

时间:2015-12-29 23:22:30

标签: c++ dictionary

我正在解析一个文件并希望将一些数据添加到地图中,以便稍后我可以参考它,但我已经调试过并注意到这些元素没有像我期望的那样被添加至。如果有人可以指出问题,因为我对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

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 *只是一个数字(指向内存的指针),当作为键插入到地图时,它只是作为数字而不是字符串进行比较。因为数字(指针)可能总是相同(在堆栈中的相同位置),所以地图只用一个键填充。