我正在尝试开发一个简单的三维模型查看器,它应该能够以obj格式逐行读取文件。这似乎很简单,但是当std::getline
点击eof
时,程序会以分段错误退出。
在这里,我做了最少量的代码,这给了我一个段错误(我在这里使用std::cin
,所以我的程序不会立即结束,但我实际上有机会输入一些东西到它,并手动输入一个eof):
std::string line;
while(std::getline(std::cin, line))
{
std::cout<<line;
}
另外需要注意的是,如果包含eof的行为空,则此代码只会产生段错误;否则,如果在包含其他任何内容的行上输入eof,则循环只会继续。
编辑: 现在,我用最小的代码重现了这个:
的main.cpp
#include <iostream>
#include "Model.h"
int main(int argc, char* argv[])
{
std::string path = "/home/thor/Skrivebord/3d_files/Exported.obj";
obj::Model(path.c_str());
return 0;
}
Model.h
#ifndef MODEL_H_INCLUDED
#define MODEL_H_INCLUDED
namespace obj
{
class Model
{
public:
Model(const char* path);
};
}
#endif // MODEL_H_INCLUDED
Model.cpp
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
#include <string>
namespace obj
{
class Model
{
public:
Model(const char* path);
private:
std::string name = ""; // Remove this line, and all works.
};
Model::Model(const char* path)
{
std::string line;
while(std::getline(std::cin, line))
{
std::cout << line;
}
}
}
答案 0 :(得分:2)
虽然逻辑难以理解,但这看起来像是一个错误。
void Face::AddVertex(float x, float y, float z)
{
if (vCnt > 3)
{
vertices[vCnt].SetPos(x, y, z);
++vCnt;
}
else
{
vertices.push_back(Vertex(x, y, z));
++vCnt;
}
}
<
而非>
更合乎逻辑,因为您的vertices
向量最初为3
void Face::AddVertex(float x, float y, float z)
{
if (vCnt < 3)
{
vertices[vCnt].SetPos(x, y, z);
++vCnt;
}
else
{
vertices.push_back(Vertex(x, y, z));
++vCnt;
}
}
答案 1 :(得分:2)
问题是您的代码有两个冲突的Model
声明。
在Model.cpp中你有
class Model
{
public:
Model(const char* path);
private:
std::string name = ""; // Remove this line, and all works.
};
但是在Model.h中你有
class Model
{
public:
Model(const char* path);
};
您应该只有Model
的一个定义,将其放在Model.h中,将#include "Model.h"
放在Model.cpp中