【问题标题】:How do I ignore a character with stringstream in C++如何在 C++ 中忽略带有字符串流的字符
【发布时间】:2015-08-05 16:05:31
【问题描述】:

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

这是我的加载函数:

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;
}

【问题讨论】:

  • 获取 Boost::Spirit 并实现完整的解析器?

标签: c++ wavefront


【解决方案1】:

您可以尝试直接检查您不想要的字符。在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
}

【讨论】:

  • 对于第二个示例,break 将带您退出 while 循环并直接转到 file.close() 这是有意的吗?
【解决方案2】:

通过您的方法,您可以使用特定的语言环境来确定 &gt;&gt; 运算符的分隔符 - 正如 here 所述,这非常讨厌。

在我的解析器中,我尝试逐个字符地读取第一个三元组(“V”或“V/VT”或“V//VN”或“V/VT/VN”),然后拆分其余部分字符串期望每个顶点有相同数量的/ - 我发现它非常健壮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多