سؤال

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).

هل كانت مفيدة؟

المحلول

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top