Emvidasch
Emvidasch

Reputation: 97

C++ Cannot use push_back on list containing custom structs

We are making a list that hold info on boardgames (name, year, score). We scan the info out of a .csv file, make a struct based on that info and then add the struct to a list. We keep doing this untill the document is done reading. Problem is that the push_back method of the list doesn't work. Here's the header of the list class: NOTE BoardGame is the custom struct. BoardGame(wstring name, int year, float score).

#pragma once
#include "GameEngine.h"
#include "BoardGame.h"
#include <list>

class BoardGameList
{
public:
  BoardGameList() {}
  virtual ~BoardGameList() {}   
// Methods
  void Load(const tstring& fileName);
// Members
private:
  std::list<BoardGame> m_Games;
};

The cpp file. Maybe I made the list the wrong way?

#include "BoardGameList.h"
#include <fstream>

void BoardGameList::Load(const tstring& fileName)
{
  tifstream file(fileName);
  tstring line;

  if(!file)
  {
    GAME_ENGINE->MessageBox(_T("Error: The file could not be found!"));
  }
  else
  {
    tstring name;
    tstring year;
    tstring score;

    while(!(file.eof()))
    {
        getline(file,line);
        year = line.substr(0,4);
        score = line.substr(5,5);
        name = line.substr(11,line.find(_T("\n")));

        float numberScore = std::stof(score);
        int numberYear = std::stoi(year);

        m_Games.push_back(BoardGame(name,numberYear,numberScore));
    }
  }
}

Running the program triggers an error (unhandled exception) that leads me to the following code in the "list" class itself I think.

_Unchecked_iterator _Unchecked_end()
    {   // return unchecked iterator for end of mutable sequence
    return (_Unchecked_iterator(this->_Myhead, this));
    }

Any ideas why I can't add stuff to my list? I tried adding something in the constructor to check if it maybe needed an element before I could add more but even then, using a breakpoint showed me that the memory could not be read.

Many thanks in advance.

EDIT: Header of BoardGame

#pragma once

#include "GameEngine.h"
struct BoardGame
{
BoardGame(tstring name, int year, float score);

//Methods
tstring operator<<(BoardGame rhs);
//Members
tstring m_Name;
int m_Year;
float m_Score;
};

Upvotes: 0

Views: 628

Answers (1)

Stephan van den Heuvel
Stephan van den Heuvel

Reputation: 2138

What exception is being thrown? This is vital to debugging your problem.

Without that information my best guess is this line:

name = line.substr(11,line.find(_T("\n")));

Will throw an exception on any line without a trailing newline, or any line less than 11 characters long.

Upvotes: 1

Related Questions