tinyxml c ++ с использованием TiXmlText для хранения целочисленных данных - PullRequest
2 голосов
/ 24 марта 2011

в соответствии со ссылкой на класс TixmlText принимает значения const char * в качестве входных данных.Мне нужно хранить целочисленные данные, прочитанные из текстового файла в XML.целочисленные данные хранятся в int vector, и каждый элемент вектора преобразуется в const char * перед передачей его в текстовую функцию Tixml.

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 class ref

Ответы [ 3 ]

2 голосов
/ 24 марта 2011

В C ++ я могу только порекомендовать TiCpp , облегченную оболочку над TinyXml, с синтаксисом C ++.

Одно заметное улучшение: использование std::string:)

РЕДАКТИРОВАНИЕ: для получения источника используйте следующую команду:

svn checkout http://ticpp.googlecode.com/svn/trunk/ ticpp-read-only
2 голосов
/ 24 марта 2011

Если вы компилируете TinyXML с поддержкой STL (что, вероятно, и должно быть), TiXmlText также имеет конструктор std::string.Как говорит sekmet64, память, выделенная std::string для 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 - это более безопасный и превосходный вариант в подавляющем большинстве случаев.

1 голос
/ 24 марта 2011

Проблема здесь:

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);
...