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, botów: 0