Я пытаюсь разработать простую программу просмотра 3d-моделей, которая должна иметь возможность читать файлы построчно в формате obj. Это казалось очень простым, однако, когда std::getline
достигает eof
, программа завершается с ошибкой сегментации.
Здесь я сделал наименьшее количество кода, который дает мне segfault (здесь я использую 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
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;
}
}
}
while (getline(cin, line))
без условногоeof()
. - person 0x499602D2   schedule 24.11.2013std::string name = ""
разрешено только в C++11. Я тестировал его без= ""
, и у меня он не вылетал (неудивительно). - person john   schedule 24.11.2013= ""
, и он все равно выдает segfault. - person   schedule 24.11.2013