2013-11-24 79 views
1

我正在尝试开发一个简单的3d模型查看器,它应该能够逐行读取obj格式的文件。这似乎很简单,但是当std::getline命中eof时,程序退出并出现分段错误。使用getline读取文件/输入时的分段错误

在这里,我做了最小的代码,它给了我一个段错误(我在这里使用了std::cin,这样我的程序不会立即结束,但我实际上有机会输入一些东西进去,手动输入EOF):

std::string line; 
while(std::getline(std::cin, line)) 
    { 
     std::cout<<line; 
    } 

另一件事要注意的是,此代码只会产生一个segfault如果包含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 

型号.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

只要'while(getline(cin,line))''没有条件'eof()'。 – 0x499602D2

+0

我已经试过了,它仍然给我一个段错误。 – Lillesort131

+0

然后向我们展示您的实际代码。 – 0x499602D2

回答

3

的问题是,你的代码有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" .cpp

+0

准确地说我需要移动哪些代码部分?如果我只是移动类本身,“Model :: Model(const char * path){...}'给了我一个错误。 – Lillesort131

+0

只需移动类本身**和**将'#include“Model.h”'添加到Model.cpp。 – john

+0

您应该只有一个类的定义。将该定义放在头文件中,并在需要的地方包含头文件。这是确保您在代码中保持一致的类定义的技术。 – john

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

仍然不起作用,但感谢您找到它。 – Lillesort131

相关问题