在C / C ++中将字符串转换为不同的数据类型

时间:2014-05-09 13:23:35

标签: c xml

如何在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个是整数,其余是字符串;我想避免创建庞大的代码,但我现在有点被阻止了我能以最聪明的方式进行转换 - 所以欢迎任何建议

问候 Ĵ

1 个答案:

答案 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;
}
相关问题