0

我无法从 xml 返回负载。这是代码:

RapidXML xml 加载器

vector<char*> ParseFanbeamGeometry(char* fileName)
{
    xml_document<> doc;
    xml_node<> * root_node;
    // Read the xml file into a vector
    ifstream theFile (fileName);
    vector<char> buffer((istreambuf_iterator<char>(theFile)), istreambuf_iterator<char>());
    buffer.push_back('\0');
    // Parse the buffer using the xml file parsing library into doc 
    doc.parse<0>(&buffer[0]);
    // Find our root node
    root_node = doc.first_node("FanbeamGeometrySettings");

    vector<char*> fambeamGeometry;
    // Iterate over the fangeometry
    for (xml_node<> * fanGeometry_node = root_node->first_node("FanGeometry"); fanGeometry_node; fanGeometry_node = fanGeometry_node->next_sibling())
    {      
        try
        {
            fambeamGeometry.push_back(fanGeometry_node->first_attribute("geometry")->value());
            fambeamGeometry.push_back(fanGeometry_node->first_attribute("D")->value());
        }
        catch (exception &e)
        {
            e.what();
        }
    }

    return fambeamGeometry;

}

主功能

int _tmain(int argc, _TCHAR* argv[])
{
    char* fangeofile = "D:\\Projects\\fanbeam\\tools\\rapidxml-1.13\\GeometrySettings.xml";

    vector<char*> fambeamGeometry = ParseFanbeamGeometry(fangeofile);

    float D = atof(fambeamGeometry[1])*N;

    getchar();
    return 0;
}

xml文件

<?xml version="1.0"?>
<FanbeamGeometrySettings>
  <FanGeometry geometry="EquiDistance" D="2"/>
</FanbeamGeometrySettings>

fambeamGeometry 正确加载了“EquiDistance”和“2”,但是当它从 ParseFanbeamGeometry() 返回到 main 时,该值变成了一些奇怪的值,例如 -18 和 -2。

有什么建议么?我不知道为什么。如何让 xml 加载器返回它加载的内容?谢谢。

4

2 回答 2

1

您的函数ParseFanbeamGeometry正在返回一个指针向量,但它们指向的数据一旦buffer在函数返回时被破坏,就会失效。

正如您已经意识到的那样,正确的方法是传回std::strings 。无论如何,这就是 C++ 中的惯用方法。

vector<std::string> ParseFanbeamGeometry(const std::string &fileName)
于 2014-03-25T14:34:24.647 回答
0

使用vector<std::string>代替

vector<char*> 

然后,使用string.c_str()转换string

char*
于 2014-03-24T01:40:58.613 回答