2

クラス参照に従って、TixmlText は const char* 値を入力として受け取ります。テキスト ファイルから読み取った整数データを xml に格納する必要があります。整数データは int ベクトルに格納され、ベクトルの各要素は 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 クラス参照

4

3 に答える 3

2

C++ では、TinyXmlの軽量ラッパーである TiCpp のみを C++ 構文でお勧めできます。

注目すべき改善の 1 つ: std::string:)の使用

編集:ソースを取得するには、次のコマンドを使用します。

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

STL サポートを使用して TinyXML をコンパイルしている場合 (おそらくそうするべきです) 、コンストラクターTiXmlTextもあります。std::stringsekmet64 が言うように、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 に答える