Как решить проблему Segmention Fault?

У меня имеется 50 строк информации о книгах, которые я хочу пропарсить в массив объектов класса Book, при попытке сделать это выдает segmention fault

result.txt:
101 Humphrey Cloak_&_Dagger 2010 14429
199 Helix White_of_the_Eye 1996 7490
132 Rydeard Claire_Dolan 2005 21594
110 Corston Resident_Evil:_Apocalypse 2006 6359
111 Burwell American_Boy:_A_Profile_of:_Steven_Prince 1994 18415
114 Coetzee The_Count_of_Monte_Cristo 1988 17376
136 Ruslin Broken_City 1996 17312
125 Stoll I_Like_Killing_Flies 2004 19781
119 Dany Underworld:_Evolution 2000 12234
145 Cordingly Flight 2003 12644
102 Rosander Revenge_of_the_Ninja 2005 7779
100 Simko Shrine 1995 20235
131 Snazel Number_One_with_a_Bullet 2011 26443
147 Boshell Like_Dandelion_Dust 1996 26886
174 Sherme Le_crocodile_du_Botswanga 2006 21934
116 Duggan Madhouse 2007 32725
198 Hadaway War_and_Peace 1998 7827
108 Symondson Me_and_Earl_and_the_Dying_Girl 2011 19963
165 Grayshan The_Boy 1994 9853
120 Simson Cheech_and_Chong's_Up_in_Smoke 1990 28560
122 Shewan Pope_Joan_(Die_Päpstin) 1999 28557
133 Jantel Mr._Moto_Takes_a_Chance 1992 14269
195 Fenge Deathwatch 2001 29984
187 Meagher Take_Me_Home_Tonight 2008 7489
112 Siegertsz Happiest_Girl_in_the_World 2010 24411
126 Baythrop Beau_Pere 2004 25498
117 Yashunin Munyurangabo 2000 20964
121 Piatti Grey_Gardens 1966 27347
177 Hasard If_Footmen_Tire_You_What_Will_Horses_Do? 1997 5392
166 Bogays Wu_Tang_Master 1998 15531
181 Oswick The_Hearse 1996 13644
112 Scutchings Torn_Curtain 1992 19821
144 Canby Johnny_Guitar 2007 23021
165 De_Bell Fresh_Bait 2009 2470
137 Delf Man_Who_Loved_Cat_Dancing 2000 26181
105 Fortun Anger_Management 2008 8668
104 Darinton Bound_for_Glory 1994 19846
106 Mangam March_of_the_Wooden_Soldiers 2000 10725
195 Ceci Snow_White_and_the_Seven_Dwarfs 2005 28449
140 Harget Laurence_Anyways 2000 32080
154 Hopewell Fire_in_the_Blood 2002 23370
178 Yatman Shuttle 1996 3460
193 Allans My_Dear_Secretary 2012 19547
141 Santoro Hara-Kiri:_Death_of_a_Samurai 1997 17045
145 Leathem Earrings_of_Madame_de... 1997 30346
149 Blumsom Shackleton's_Antarctic_Adventure 2012 8713
199 McEachern Merlusse 1994 17002
188 Trayes Born_American 2005 5406
173 Kermannes Yesterday 1994 28676
150 Grimm All_the_Way_Home 2009 26855


#include <iostream>
#include <fstream>
#define N 50
using namespace std;

class Book
{
private:
	int id;
	string author;
	string name;
	int year;
	long int price;
public:
	Book()
	{
		id = 0;
		author = "---";
		name = "---";
		year = 0;
		price = 0;
	}

	Book(int id, string author, string name, int year, long int price)
	{
		this->id = id;
		this->author = author;
		this->name = name;
		this->year = year;
		this->price = price;
	}

	int getId()
	{
		return id;
	}

	string getAuthor()
	{
		return author;
	}

	string getName()
	{
		return name;
	}

	int getYear()
	{
		return year;
	}

	int getPrice()
	{
		return price;
	}
	void getAll()
	{
		cout << "Id:" << id << "\t" << "Author:" << author << "\t" << "Name:" << name << "\t" << "Year:" << year << "\t" << "Price:" << price << endl;
	}
};



int main()
{

  setlocale(LC_ALL, "ru");
  string path = "result.txt";
  ifstream fin;
  fin.open(path);
  string str1,str2,str3,str4,str5;
  int t = 0;
  Book A[N];
  if (!fin.is_open())
  {
    cout << "Ошибка открытия файла" << endl;
  }
  else
  {
    while (!fin.eof())
    {
      fin >> str1;
      fin >> str2;
      fin >> str3;
      fin >> str4;
      fin >> str5;
      A[t] = Book(stoi(str1), str2, str3, stoi(str4), stoi(str5));
      t++;
    }
  }
  for (int i = 0; i < N; i++)
  {
    A[i].getAll();
  }
  fin.close();
	return 0;
}

Результат gdb:
622f206ac6aaa704083228.png
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Segmentation fault - это ошибка работы с памятью. Или выход за границы массива, или что-то не так с указателями.

Я подозреваю, что в файле у вас не 50 строк (мне лень считать). Вот вы и вылезаете за границу массива.

Ну или там какие-то лишние переводы строк, пробелы имеются. поэтому fin.eof() не выполняется после считывания последней строки. Потом вы пытаетесь что-то еще прочитать, но получаете назад пустую строку. Это бы не было проблемой, но вы потом пытаетесь это все запихать в 51-ый элемент массива.

Советую вместо define N и статического массива использовать std::vector. В цикле считывания файла делайте push_back нового объекта в вектор (а еще лучше, emplace_back для экономии лишнего копирования).

При выводе берите size() у вашего вектора.

Если вы в выводе заметите лишнюю книгу в конце с пустыми данными, то можно добавить проверку при вводе - если хоть одна из 5 строк пустая - то не надо создавать новую книгу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы