2013-11-24 2 views
1

obj 형식의 파일을 한 줄씩 읽을 수있는 간단한 3D 모델 뷰어를 개발하려고합니다. 이것은 매우 단순한 것처럼 보이지만, 이 eof에 도달하면 프로그램은 세그먼트 오류로 종료됩니다.getline을 사용하여 파일/입력을 읽는 중 세그먼트 오류가 발생했습니다.

여기서는 segfault를 제공하는 코드를 가장 적게 만들었습니다 (여기서는 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 

모델 .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

조건부'eof()'없이'while (getline (cin, line))'을 수행하십시오. – 0x499602D2

+0

나는 그것을 이미 시도해 봤는데, 여전히 나에게 segfault를 준다. – Lillesort131

+0

실제 코드를 보여주십시오. – 0x499602D2

답변

3

때문에 문제는 코드가 Model 두 충돌 선언을 가지고 있다는 것입니다.

당신이

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.cpp에서

당신은 Model 중 하나 정의를해야 만 넣어 그 Model.h 및 모델에 #include "Model.h" .cpp

+0

정확히 어떤 부분을 이동해야합니까? 방금 클래스를 옮기면,'Model :: Model (const char * path) {...}'는 에러를 발생시킵니다. – Lillesort131

+0

그냥 클래스 자체를 이동하고 ** Model.cpp에'#include "Model.h"를 ​​추가하십시오. – 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

관련 문제