简体   繁体   中英

Segmentation fault while reading file/input with getline

I am trying to develop a simple 3d-model viewer, which should be able to read files line by line in the obj format. This seemed to be very simple, however when std::getline hits eof , the program exits with a segmentation fault.

Here, I've made the smallest amount of code which gives me a segfault (I use std::cin here, so that my program doesn't end immediately, but I actually get a chance to input some stuff into it, and manually enter an eof):

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

Another thing to notice is, that this code will only produce a segfault if the line containing eof is empty, otherwise, if eof is entered on a line containing anything else, the loop simply carries on.

Edit: Now, I've reproduced this with the smallest code possible:

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

This looks like an error although the logic is hard to follow.

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

It's more logical with < not > since your vertices vector is initially size 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;
    }
}

The problem is that your code has two conflicting declarations of Model .

In Model.cpp you have

class Model
{
public:
    Model(const char* path);

private:
    std::string name = ""; // Remove this line, and all works.
};

but in Model.h you have

class Model
{
public:
    Model(const char* path);
};

You should have one definition of Model only, put that in Model.h and #include "Model.h" in Model.cpp

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM