Search code examples
c++fileopenglscanfstrcmp

Can't read wavefront file


I've a problem with this code:

    void readObj(const char* fName, std::vector<Vector3> &tempVertex, std::vector<Face3>  &tempFaces){
    FILE* file;
    file = fopen(fName, "r");
    if (file == 0)
        printf("#ERROR# can't open file!");
    else{
        while(true){
         char lineHeader[1000];
         int res = fscanf(file, "%s", lineHeader);
         if (res == EOF)
             break;
         else if (strcmp(lineHeader, "v ") == 0){
             Vector3 v;
             fscanf(file, "%f %f %f\n", &v.x, &v.y, &v.z);
             cout<<"tempVertex.push_back(v)";
             tempVertex.push_back(v);
         }
         else if (strcmp(lineHeader, "f ") == 0){
             Face3 f;
             fscanf(file, "%d %d %d", &f.a, &f.b, &f.c);
             cout<<"tempFaces.push_back(f)";
             tempFaces.push_back(f);
         }
         else{
            fscanf(file, "/n");
            cout<<"Nothing in this line!\n";
            }
        }
    }
}

Here I use it:

private: System::Void readFile(System::Object^  sender, System::EventArgs^  e) {
         vector<Vector3> test;  
         vector<Face3> ftest;
         reading::readObj("Text.txt", test, ftest);
     }

Test.txt:

    v 1.0f 2.0f 3.0
    f 1 2 3

And it produce only:

    Nothing in this line! (x8)

instead of tempVertex.push_back(v) and tempFaces.push_back(f).


Solution

  • Here's a more C++ idiomatic solution:

    void readObj(const std::string& fName,
                 std::vector<Vector3>& tempVertex,
                 std::vector<Face3>& tempFaces)
    {
        std::ifstream file(fName);
    
        std::string line;
        while (std::getline(file, line))
        {
            std::istringstream iss(line);
    
            char type;
            if (iss >> type)
            {
                if (type == 'v')
                {
                    Vector3 v;
                    if (iss >> v.x >> v.y >> v.z)
                        tempVertex.push_back(v);
                }
                else if (type == 'f')
                {
                    Face3 f;
                    if (iss >> f.a >> f.b >> f.c)
                        tempFaces.push_back(v);
                }
            }
        }
    }
    

    References:


    As for your current code (as posted in the question) a big problem is this:

    strcmp(lineHeader, "v ")
    /* here -------------^ */
    

    The string lineHeader only contains the "v" or "f", not the trailing space.