如何在C ++中巧妙地将字符串转换为不同的变量类型,并将它们乘以比例因子?
我正在读取xml文件中的值;如果xml中的属性调用" scale_factor"已发生,然后我需要将从xml中提取的值乘以此因子。我的节点如下所示:
<Pos>
<variableX value="234.2" scale_factor="0.01"/>
<variableY value="233.1" scale_factor="100"/>
<variableZ value="332.2/>
<transparent value = "1"/>
</Pos>
以及这些值的相应结构:
structure Pos {
float variableX
float variableY
float variableZ
int transparent;
}
检索scale_factor的值:
int getScaleFactor(xmlNode *node, float *scale_factor)
{
*scale_factor = 1;
char *scale_attr = (char *)xmlGetProp(node, (xmlChar*)"scale_factor");
if (scale_attr == NULL)
{
return 0;
}
else
{
printf("scale factor for: %s is: %f\n", node->name, scale_factor);
*scale_factor = atof(scale_attr);
}
return 1;
}
并阅读值:
float value;
float scale_factor;
int is_scaling;
xmlNode *cur = node->xmlChildrenNode;
while (cur != NULL) {
value = (char *)xmlGetProp(cur, (xmlChar*)"value");
is_scaling = getScaleFactor(cur, &scale_factor);
if (!(xmlStrcasecmp(cur->name, (const xmlChar *)"variableX"))) {
pos.variableX = atof(value);
if (is_scaling) {
pos.variableX = pos.variableX * scale_factor;
}
}
else if (!(xmlStrcasecmp(cur->name, (const xmlChar *)"variableY"))) {
pos.variableY = atof(value);
if (is_scaling) {
pos.variableY = pos.variableY * scale_factor;
}
}
else if (!(xmlStrcasecmp(cur->name, (const xmlChar *)"variableZ"))) {
pos.variableZ = atof(value)
if (is_scaling) {
pos.variableZ = pos.variableZ * scale_factor;
}
else if (!(xmlStrcasecmp(cur->name, (const xmlChar *)"transparent"))) {
pos.transparent = atoi(value)
}
cur = cur->next;
}
假设我的节点有134个字段而76个是浮点数,33个是整数,其余是字符串;我想避免创建庞大的代码,但我现在有点被阻止了我能以最聪明的方式进行转换 - 所以欢迎任何建议
问候 Ĵ
答案 0 :(得分:0)
在C99 / C ++中,您可以执行以下操作:
const char *str[4];
str[0] = "variableX";
str[1] = "variableY";
str[2] = "variableZ";
str[3] = "transparent";
float data[4] = {0.0};
while (cur != NULL) {
value = (char *)xmlGetProp(cur, (xmlChar*)"value");
is_scaling = getScaleFactor(cur, &scale_factor);
for (int i=0; i<4; i++){
if (!(xmlStrcasecmp(cur->name, (const xmlChar *)str[i]))) {
data[i] = atof(value);
if (is_scaling) {
data[i] = data[i] * scale_factor;
}
}
pos = { .variableX = data[0], .variableY = data[1],
.variableZ = data[2], .transparent=(int)(data[3] + 0.5) }; // C99
// pos = {data[0], data[1], data[2], (int)(data[3]+0.5)}; // C++
cur = cur->next;
}