Wczytywanie, baza danych, string zawierajacy spacje

0

Witam mam pewien problem z stworzoną przeze mnie "Bazą danych". Najpierw wkleję kod źrodlowy:

Funkcja dodajaca nowy wpis, w tym wypadku jest to film.

 
void DodajNowyFilm( Film& nowy )
{   
	system("cls");
	string pomocniczy;
	vector<string> b;
	cout << "Podaj nazwe filmu" << endl;
	cin.ignore();
	getline(cin,pomocniczy);
	nowy.nazwa=pomocniczy;
	cout << nowy.nazwa << endl;
    cout << "Podaj typ, Wpisz odpowieni numer:" << endl;

	b.push_back("Horror");
	b.push_back("Thriller");
	b.push_back("Komedia");
	b.push_back("Historyczny");
	b.push_back("Sensacyjny");
	b.push_back("fantastyczny");
	b.push_back("Kryminalny");
	b.push_back("Przygodowy");
	b.push_back("Muzyczny");
	b.push_back("Animowany");
	b.push_back("Dramatyczny");

	 int rozm=b.size();
	 int rodzaj;
     
	  for(int i=0; i < rozm; i++)
	  {
		  cout << i + 1 << ". " << b[i] << " ";
	  }

	 cout << endl;
     
	 cin >> rodzaj;
	 nowy.typFilmu=b[rodzaj-1];
	 cout << "Podaj rok wydania" << endl;
	 cin >> nowy.RokWydania;
	 
}

Funkcja zapisu vectora zawierajacego dane z klasy do pliku:

void zapiszBaze( char *filename, vector<Film>* baza )
{
	ofstream plik(filename, ios::binary);
		if(!plik.is_open())
			cout << "Błąd pliku" << endl;
		else
	{
       int k = baza->size();
       for (int i = 0; i < k; i++ )
	   plik.write((char*) &(baza->at(i)), sizeof(Film));    
	}
  plik.close();

} 

Funkcja inicjujaca baze danych, tzn wczytujaca z pliku do vectora:

 
vector<Film>* inicjujbaze( char *filename )
{  
	vector<Film> *baza=NULL;
	baza = new vector<Film>();
	ifstream plik(filename, ios::binary| ios::ate);
	if(plik.is_open())
	{
		int n = plik.tellg(); 
		plik.seekg(0, ios::beg);
        char *p = new char[n];
		plik.read(p,n);
		Film *t = (Film*) p;
		for (int i=0; i<n/sizeof(Film); i++)
			baza->push_back(t[i]);
		delete [] p;
		plik.close();
	}
    return baza;
	
}

Problem w tym, że nazwy filmów są często długie i wieloczłonowe, przy pojedynczym wyrazie lub krótkiej podwójnej nazwie program działa dobrze, jednakże przy dłuższych i złożonych nazwach występuje bład przy wczytywaniu z pliku:
Unhandled exception at 0x5cfecaac (msvcr100d.dll) in DBproject.exe: 0xC0000005: Access violation reading location 0x00585430.

@Edit
Program wykrzacza się również przy długich nazwach jednoczłonowych, tzn odczytuje je zle z pliku, jakies smieci :(

@edit2
Jesli nazwa ma >20 znakow to wtedy zaczyna występowac ten blad. I na pewno tkwi w funkcji "InicjujBaze".

0
  1. Lekcja na dziś: debugger
  2. A w klasie Film mam nadzieję że wszystko masz poprawnie napisane?
0
 
#include "KartaKlienta.h"


class Film
{
public:
   string nazwa;
   string typFilmu;
   int RokWydania;
};

vector<Film>*  inicjujbaze( char *filename );

void DodajNowyFilm( Film& );

bool alfabetycznieNazwa( const Film&, const Film& );
bool alfabetycznieTyp( const Film&, const Film& );
bool sortWydanie(const Film&, const Film&);

Raczej jest dobrze :p

Ta linijka w funkcji inicjujBaze powoduje błąd.

baza->push_back(t[i]); 

@Edit
Ok wiem już co jest problemem, wczesniej ta baze mialem napisana na podstawie tablicy char'ów, następnie zmienilem na stringi, czyli jak mam obecnie. I przez to prawdopodobnie występuje ten blad. Wczesniej np: nazwa była o dlugosc tablica o dlugosc 20, a teraz ten blad pojawia się przy > 20 znakach. Jakas magiczna zbierznosc.
Bardzo pomoglaby mi podpowiedz jak inaczej napisac ta funkcje InicjujBaze. Bo prawdopodbnie chodzi tu o nieregularnosc dlugosc zmiennych w klasie bo wczesniej byly okreslone przez tablice.

1 użytkowników online, w tym zalogowanych: 0, gości: 1