2

根据类引用,TixmlText 将 const char* 值作为输入。我需要将从文本文件读取的整数数据存储到 xml 中。整数数据存储在 int 向量中,向量的每个元素在传递给 Tixml 文本函数之前都转换为 const char*。

const char* intToXmlChar(int num)
{
    stringstream abc;
    string value;
    abc<<num;
    value=abc.str();
    const char* ret_val = value.c_str();
    //char* conv_val = const_cast<char*>(ret_val);
    return ret_val;
}

但是当我终于看到生成的 xml 文档时。我在保存数字的元素中得到垃圾值

<timestamp>1&#x00;504</timestamp>

我们如何正确存储整数数据?

我已经在tinyxml.h中追踪到问题发生的地方

class TiXmlNode : public TiXmlBase

功能

void SetValue(const char * _value) {
printf(" pre ---number--- %s  using this \n",_value); //-- if the value is say 18504
 value = _value;
printf(" post ---number--- %s  using this \n",_value); //-- becomes 1&#x00;504 saved in xml
    }

值相同class TiXmlNode
的地方TIXML_STRING value;

  • 问题:我错过了一些非常简单的事情吗?
  • 问题:如何正确存储整数数据

编辑:感谢文档的答案,我错过了使用编译时间定义:

TIXML_USE_STL

编译一个或另一个版本。这可以由编译器传递,或者设置为“tinyxml.h”的第一行。

注意:如果在 Linux 中编译测试代码,设置环境变量 TINYXML_USE_STL=YES/NO 将控制 STL 编译。在 Windows 项目文件中,提供了 STL 和非 STL 目标。在您的项目中, 将“#define TIXML_USE_STL”行添加为 tinyxml.h 的第一行可能是最简单的。

Tinyxml 类参考

4

3 回答 3

2

在 C++ 中,我只能推荐TiCpp,它是 TinyXml 的轻量级包装器,具有 C++ 语法。

一个显着的改进:使用std::string:)

编辑:要获取源代码,请使用以下命令:

svn checkout http://ticpp.googlecode.com/svn/trunk/ ticpp-read-only
于 2011-03-24T10:35:29.270 回答
2

如果您正在编译带有 STL 支持的 TinyXML(您可能应该支持)TiXmlText也有一个std::string构造函数。正如 sekmet64 所说,由std::stringfor分配的内存c_str()在函数退出时被释放,因此您实际上是在返回一个指向垃圾的指针。

但是,我强烈建议您不要分配自己的内存。相反,返回一个 std::string (它将为您处理内存):

std::string intToXmlChar(int num)
{
    std::stringstream abc;
    std::string value;
    abc<<num;
    return abc.str();
}

然后将其传递给 TiXmlText 构造函数

TiXmlText node(intToXmlChar(i));

或作为

TiXmlText node(intToXmlChar(i).c_str());

后一种情况是可以的,因为TiXmlText会在临时字符串被销毁之前对其进行复制。

char*一般来说,除非(或直到)绝对必要,否则std::string在绝大多数情况下,远离转换是一种更安全、更优越的选择。

于 2011-03-24T10:35:38.473 回答
1

问题在这里:

const char* ret_val = value.c_str();

来自http://www.cplusplus.com/reference/string/string/c_str/

返回的数组指向一个内部位置 [...],但此数组中的值不应在程序中修改,并且仅允许在下一次调用字符串对象的非常量成员函数之前保持不变。

相反,您可以将 char 数组复制strcpy()到一个新指针,以确保它不会在以后更改或在您退出范围时被删除。或者更好的是使用 c 函数将 int 直接转换为 char*。

#include <stdlib.h>

char* intToXmlChar(int num)
{
    char *ret_val;
    itoa(num, ret_val, 10);
    return ret_val;
}

我认为你做不到,const因为你必须计算它,只有当你调用函数时

const char *a = intToXmlChar(2);
于 2011-03-24T10:26:57.633 回答