如何在C ++中忽略带有stringstream的字符

时间:2015-08-05 16:05:32

标签: c++ wavefront

所以我正在写一个Wavefront OBJ加载器。我能够获得顶点,法线和纹理坐标,但我遇到了面部问题。我想弄清楚如何忽略某些字符,例如" //"和" /"在C ++中使用std :: stringstream。反正有没有这样做?感谢。

这是我的加载功能:

bool Model::load(std::string file_name) {
   std::string line; 
   std::ifstream file(file_name.c_str());
   if(file.is_open()) 
   {
      while(std::getline(file, line))
      {  
        std::stringstream stream(line);
        stream >> line;

        if(line == "#") 
        {
            // ignore.
        }
        if(line == "v") // vertices
        { 
            double x, y, z;
            stream >> x >> y >> z;
            v.push_back(x);
            v.push_back(y);
            v.push_back(z);
            #ifdef DEBUG
            std::cout << "v " << x << " "<< y << " " << z << "\n";
            #endif
        }
        if(line == "vt") // texture coordinates
        {
            double u, v;
            stream >> u >> v;
            vt.push_back(u);
            vt.push_back(v);
            #ifdef DEBUG
            std::cout << "vt " << u << " "<< v << "\n";
            #endif
        }
        if(line == "vn") // normals
        {
            double x, y, z;
            stream >> x >> y >> z;
            vn.push_back(x);
            vn.push_back(y);
            vn.push_back(z);
            #ifdef DEBUG
            std::cout << "vn " << x << " "<< y << " " << z << "\n";
            #endif
        }
        if(line == "f")
        {
           short a, b, c;
           stream >> a; stream >> b; stream >> c;
           a--; b--; c--;

           f.push_back(a);
           f.push_back(b);
           f.push_back(c);

           std::cout << a << " " << b << " " << c << "\n";              
        }

    }
    file.close();
    return true;    
  } return false;
}

2 个答案:

答案 0 :(得分:2)

您可以尝试直接检查您不想要的字符。在if声明中,您可以continuebreak或根据您的目的放置任何内容。

if (line == "/" || line == "//") {

    continue; //if you want to move on to the next loop iteration

    break;    //if you want to leave the loop

    //Do nothing if you want to continue in the current loop iteration
}

答案 1 :(得分:0)

使用您的方法,您可以使用特定的区域设置来确定>>运算符的分隔符 - 这非常讨厌here

在我的解析器中,我尝试阅读第一个tripplet(&#34; V&#34;或&#34; V / VT&#34;或&#34; V // VN&#34;或&#34; V / VT / VN&#34;)逐个字符地解析,然后分割字符串的其余部分,期望每个顶点具有相同数量的/ - 我发现它非常健壮。