C++ TinyXML和标签和格式问题
TinyXML有一个无法修复的问题。我用C++扩展了MFC应用程序的工作。应用程序进行自动测试。完成后,它将所有数据保存在一个XML文件中。下面是我的DOM树的开头C++ TinyXML和标签和格式问题,c++,xml,tinyxml,C++,Xml,Tinyxml,TinyXML有一个无法修复的问题。我用C++扩展了MFC应用程序的工作。应用程序进行自动测试。完成后,它将所有数据保存在一个XML文件中。下面是我的DOM树的开头 亚历克斯 12345 问题是该库似乎在12345之后添加了一个随机换行符。应该是: 12345 你能帮我吗?我什么都试过了。。。下面是代码片段。另外,在关闭新元素的标记之前,即在 ?? //代码从这里开始 TiXmlDocument文档; TiXmlDeclaration*decl=新的TiXmlDeclaration(“1
亚历克斯
12345
问题是该库似乎在12345之后添加了一个随机换行符。应该是:
12345
你能帮我吗?我什么都试过了。。。下面是代码片段。另外,在关闭新元素的标记之前,即在
??
//代码从这里开始
TiXmlDocument文档;
TiXmlDeclaration*decl=新的TiXmlDeclaration(“1.0”、“utf-8”和“);
//doc.FirstChildElement();
LinkedChild文件(decl);
TiXmlElement*rootelement=新的TiXmlElement(“测试数据”);
doc.LinkEndChild(rootelement);
TiXmlText*textTestData=新的TiXmlText(“”);
rootelement->LinkEndChild(textTestData);
//操作员节点
TiXmlElement*运算符=新的TiXmlElement(“运算符”);
//树根
rootelement->LinkEndChild(操作符);
TiXmlText*textOperator=新的TiXmlText(“Alex”);
操作符->LinkedChild(textOperator);
//ParentBarcode节点
TiXmlElement*条形码=新的TiXmlElement(“父条形码”);
//树根
rootelement->LinkEndChild(条形码);
//将串行数据保存到stringstream
串流序列;
序列号);
std::string myserial=serial.str();
//删除空格
擦除(std::remove_if(myserial.begin()、myserial.end()、::isspace)、myserial.end());
字符缓冲区[sizeof(myserial)+1];
//int-ret=snprintf(缓冲区,sizeof(myserial),“%05ld”,DlgPtr>mlserialNumber);
int ret=sprintf_s(缓冲区,大小为(myserial),“%05ld”,myserial);
const char*charSerial=缓冲区;
TiXmlText*textbarcode=新的TiXmlText(charSerial);
条形码->LinkedChild(文本条形码);
没有错误消息,只是元素的标记不在同一行上关闭。
我用完全相同的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);
这很好,但从C++11开始,您也可以执行以下操作:
std::string myserial = std::to_string(DlgPtr->m_lSerialNumber);
然后从myserial
中删除空格,这并没有什么坏处,但我很确定不会有空格需要删除,因为您刚刚从单个整数构造了字符串
这就是它开始出错的地方
你制作了一个字符数组缓冲区来写入你的数字,但是你用sizeof(myserial)
来调整它的大小,这会给你对象在内存中占用的字节数,包括簿记内容、vtable指针等。所以你在这里分配了太多的空间myserial.size()
会让您更适合
然后尝试使用sprintf\u s
将数字写入新的缓冲区,但使用%05ld”
作为格式字符串,使用std::string作为参数-这根本不起作用<代码>%05ld“告诉sprintf_s
期望一个整数作为输入(并用额外的零将其填充到5位数字),因此它只接受该参数,将其强制转换为整数,并将前4个字节解释为数字-这没有意义,可能会调用未定义的行为
这不仅不能满足您的要求,而且您已经有了一个包含您的号码的字符串,您只需调用myserial.c_str()
即可获得包含myserial
内容的const char*
。这意味着整个第二部分可以替换为:
TiXmlText *textbarcode = new TiXmlText(std::to_string(DlgPtr->m_lSerialNumber).c_str());
barcode->LinkEndChild(textbarcode);
正如@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);
这很好,但从C++11开始,您也可以执行以下操作:
std::string myserial = std::to_string(DlgPtr->m_lSerialNumber);
然后从myserial
中删除空格,这并没有什么坏处,但我很确定不会有空格需要删除,因为您刚刚从单个整数构造了字符串
这就是它开始出错的地方
你制作了一个字符数组缓冲区来写入你的数字,但是你用sizeof(myserial)
来调整它的大小,这会给你对象在内存中占用的字节数,包括簿记内容、vtable指针等。所以你在这里分配了太多的空间myserial.size()
会让您更适合
然后尝试使用sprintf\u s
将数字写入新的缓冲区,但使用%05ld”
作为格式字符串,使用std::string作为参数-这根本不起作用<代码>%05ld“告诉sprintf_s
期望一个整数作为输入(并用额外的零将其填充到5位数字),因此它只接受该参数,将其强制转换为整数,并将前4个字节解释为数字-这没有意义,可能会调用未定义的行为
这不仅不能满足您的要求,而且您已经有了一个包含您的号码的字符串,您只需调用myserial.c_str()
即可获得包含myserial
内容的const char*
。这意味着整个第二部分可以替换为:
TiXmlText *textbarcode = new TiXmlText(std::to_string(DlgPtr->m_lSerialNumber).c_str());
barcode->LinkEndChild(textbarcode);
将
sizeof(myserial)
更改为myserial.size()
或仅使用TiXmlText*textbarcode=new TiXmlText(myserial.cstr())代码>sprintf_s(缓冲区,大小(myserial),“%05ld”,myserial)代码>是完全错误的。你会怎么做呢?int ret=snprintf_s(缓冲区,大小(myserial),“%05ld”,DlgPtr>m_lSerialNumber);在代码中似乎工作正常。对于C++编程BTW还是新的,如果这条线工作,为什么它被注释掉?使用导致您的问题的实际代码将sizeof(myserial)
更改为myserial.size()
或仅使用TiXmlText*textbarcode=new TiXmlText(myserial.cstr())代码>sprintf_s(缓冲区,大小(myserial),“%05ld”,myserial)代码>是完全错误的。你会怎么做呢?int ret=snprintf_s(缓冲区,大小