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".