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.