gpt4 book ai didi

c++ - TinyXML 以及标签和格式问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:03 25 4
gpt4 key购买 nike

我有一个无法修复的 TinyXML 问题。我已经使用 C++ 扩展了一个 MFC 应用程序来工作。该应用程序进行自动化测试。完成后,它将所有数据保存在一个 XML 文件中。在我的 DOM 树的开头下方。

<?xml version="1.0" encoding="utf-8" ?>
<TestData>
<Operator>Alex</Operator>
<ParentBarCode>12345
</ParentBarCode>
<Measurements>

问题是库似乎在 12345 之后添加了一个随机换行符。它应该是:

<ParentBarCode>12345</ParentBarCode>

你能帮帮我吗?我已经尝试了一切......下面的代码片段。另外,有没有办法在关闭新元素的标签之前删除换行符,即在

之前
</ParentBarCode>?? 
//Code starts here
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration("1.0","utf-8", "");
//doc.FirstChildElement();
doc.LinkEndChild(decl);
TiXmlElement *rootelement = new TiXmlElement("TestData");
doc.LinkEndChild(rootelement);
TiXmlText *textTestData = new TiXmlText("");
rootelement->LinkEndChild(textTestData);
//Operator node
TiXmlElement *Operator = new TiXmlElement("Operator");
//Tree root
rootelement->LinkEndChild(Operator);
TiXmlText *textOperator = new TiXmlText("Alex");
Operator->LinkEndChild(textOperator);
//ParentBarcode Node
TiXmlElement *barcode = new TiXmlElement("ParentBarCode");
//Tree root
rootelement->LinkEndChild(barcode);

//saving serial to a stringstream

stringstream serial;
serial << (DlgPtr->m_lSerialNumber);
std::string myserial = serial.str();
//Removing spaces
myserial.erase(std::remove_if(myserial.begin(), myserial.end(),::isspace), myserial.end());

char buffer[sizeof(myserial) + 1];
//int ret = snprintf(buffer, sizeof(myserial), "%05ld", DlgPtr>m_lSerialNumber);
int ret = sprintf_s(buffer, sizeof(myserial), "%05ld", myserial);
const char * charSerial = buffer;
TiXmlText *textbarcode = new TiXmlText(charSerial);
barcode->LinkEndChild(textbarcode);

没有错误信息,只是元素的标签没有在同一行结束。我用完全相同的 DOM 树创建了一个小型沙箱项目,但它在那里运行良好。我在想也许还有另一个问题我没有看到 sprintf_s?提前谢谢你。

最佳答案

正如@AlanBirtles 在评论中指出的那样,您的这部分代码不是很好:

stringstream serial;
serial << (DlgPtr->m_lSerialNumber);
std::string myserial = serial.str();
//Removing spaces
myserial.erase(std::remove_if(myserial.begin(), myserial.end(),::isspace), myserial.end());

char buffer[sizeof(myserial) + 1];
int ret = sprintf_s(buffer, sizeof(myserial), "%05ld", myserial);
const char * charSerial = buffer;
TiXmlText *textbarcode = new TiXmlText(charSerial);
barcode->LinkEndChild(textbarcode);

您通过将 DlgPtr->m_lSerialNumber 转换为 std::string 开始变得强大:

stringstream serial;
serial << (DlgPtr->m_lSerialNumber);
std::string myserial = serial.str();

这很好,不过从 C++11 开始你也可以这样做:

std::string myserial = std::to_string(DlgPtr->m_lSerialNumber);

然后从 myserial 中删除空格,这不会有什么坏处 - 但我很确定不会有任何要删除的空格,因为您刚刚从单个整数构造了字符串。

这就是它开始出错的地方。

你创建了一个字符数组缓冲区来写入你的数字,但是你用 sizeof(myserial) 来调整它的大小,这给了你对象在内存中占用的字节数,包括簿记东西,vtable 指针等。所以你最终会在这里分配太多空间; myserial.size() 会让你更合适。

然后您尝试使用 sprintf_s 将数字写入新缓冲区,但您使用 "%05ld" 作为格式字符串,并使用 std::string 作为争论 - 那是行不通的。 "%05ld" 告诉 sprintf_s 期望一个整数作为输入(并用额外的零将其填充到 5 位数字),因此它只接受该参数,将其转换为 int ,并将前 4 个字节解释为数字 - 这没有意义,并且可能会调用未定义的行为。

这不仅没有做你想做的事,你已经有了一个包含你的号码的字符串,只需调用 myserial.c_str() 就可以得到一个 const char*myserial 的内容。这意味着整个第二部分可以替换为:

TiXmlText *textbarcode = new TiXmlText(std::to_string(DlgPtr->m_lSerialNumber).c_str());
barcode->LinkEndChild(textbarcode);

关于c++ - TinyXML 以及标签和格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57866775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com