Problem z baza danych książek

0

Witam.
Jestem w trakcie robienia bazy danych z książkami.
Znalazłem fajny kod w internecie, przerobiłem go, ale klapa.
Ktoś może mi pomóc co jest źle?

#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;

struct ksiazka
{
    int numer;         ///   numer w bazie
    string tytul;  //tytul
    string autor;  //autor
    int rok;                   ///   rok produkcji
    float cena;
};

void dodaj_do_bazy(char *in,ksiazka *s,int n)
{
    ofstream plik;
    plik.open(in);

    for(int i=0;i<n;++i)
    {
        s[i].numer = i+1;
        plik<<s[i].numer<<endl;
        cout<<"Podaj tytul :\n";
        cin>>s[i].tytul;
        plik<<s[i].tytul<<endl;
        cout<<"Podaj autora :\n";
        cin>>s[i].autor;
        plik<<s[i].autor<<endl;
        cout<<"Podaj rok wydania :\n";
        cin>>s[i].rok;
        plik<<s[i].rok<<endl;
        cout<<"Podaj cene ksiazki :\n";
        cin>>s[i].cena;
        plik<<s[i].cena<<endl;

        plik<<"\n\n";
    }
    plik.close();
}

///funkcja liczaca rozmiar tablicy  z ksiazkami, zwroci liczbe do ktorej dodamy nowe pozycje

int rozmiar(char *in)
{
    string autor , tytul;
    int rok , numer;
    double cena;

    ifstream plik;
    plik.open(in);
    int rozm = 0;

    while(!plik.eof())
    {
        plik>>numer;
        plik>>tytul;
        plik>>autor;
        plik>>rok;
        plik>>cena;

        rozm += 1;
    }

    plik.close();
    return rozm;
}

//wczytanie to tablicy
void zpliku(char *in,ksiazka *s,int n)
{
    ifstream plik;
    plik.open(in);

    for(int i=0;i<n;++i)
    {
        plik>>s[i].numer;
        plik>>s[i].tytul;
        plik>>s[i].autor;
        plik>>s[i].rok;
        plik>>s[i].cena;
    }
}

/// funkja wypisujaca wszystkie ksiazki

void wypisz(ksiazka *s,int n)
{
    for(int i=0;i<n;++i)
    {
        cout<<"Nr."<<s[i].numer<<endl;
        cout<<"Tytul :         "<<s[i].tytul<<endl;
        cout<<"Autor :         "<<s[i].autor<<endl;
        cout<<"Rok wydania : "<<s[i].rok<<endl;
        cout<<"Cena :          "<<s[i].cena<<endl;
        cout<<"-  -  -  -  -  -  -  -  -  -  -  -  -\n";
    }
}

/// funkcja sortuje po nazwie 

void sort2(ksiazka *s,int n)
{
    ksiazka tmp;
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n-1;++j)
        {
            if(s[j].tytul > s[j+1].tytul)
            {
                tmp = s[j+1];
                s[j+1] = s[j];
                s[j] = tmp;
            }
            if(s[j].tytul == s[j+1].tytul)
            {
                if(s[j].autor > s[j+1].autor)
                {
                    tmp = s[j+1];
                    s[j+1] = s[j];
                    s[j] = tmp;
                }
            }
        }       
    }
}   

/// funkcja usuwajaca ksiazke bazy

void usun(ksiazka *s,int n,int ktory)
{
    int tmp;
    for(int i=0;i<n;++i)
    {
        if(i+1 == ktory)
        {
            tmp = i;
        }
    }

    for(int i=tmp;i<n;++i)
    {
        //s[i] = s[i+1];

        s[i].tytul = s[i+1].tytul;
        s[i].autor = s[i+1].autor;
        s[i].rok   = s[i+1].rok;
        s[i].cena  = s[i+1].cena;
    }
}

int main(int argc,char **argv)
{   
    int znak;   

    strcpy(argv[1],"baza.txt");
    //argv[1] = "baza.txt";

    do
    {
    cout<<"     Utworz baze danych (plik)           wcisnij - 1\n"; 
    cout<<"     Dopisanie nowej ksiazki             wcisnij - 2\n";
    cout<<"     Wypisanie wszystkich ksiazek            wcisnij - 3\n"; 
    cout<<"     Usuniecie ksiazki z bazy                wcisnij - 4\n";
    cout<<"     Sortowanie ksiazek po nazwie            wcisnij - 5\n";

    cout<<"     Wyjscie z programu                          wcisnij - 0\n";

    cout<<"Co chcesz robic ??\n";

    cin>>znak;

    switch(znak)
    {
        case 1:
        {
            int n;
            cout<<"Ile ksiazek zapisac w bazie ?\n";
            cin>>n;         
            ksiazka *s = new ksiazka [n];
            dodaj_do_bazy(argv[1],s,n);
            delete [] s;
            break;
        }
        case 2:
        {

            int ile;
            cout<<"Ile ksiazek chcesz dopisac do bazy ?\n";
            cin>>ile;   

            int roz = rozmiar(argv[1])+ile-1;
            int rozm = rozmiar(argv[1])-1;

            ksiazka *s = new ksiazka [roz];
            zpliku(argv[1],s,rozm);

            for(int i=rozm;i<roz;++i)
            {
                s[i].numer = i+1;
                cout<<"Podaj Tytul :\n";
                cin>>s[i].tytul;
                cout<<"Podaj Autora :\n";
                cin>>s[i].autor;
                cout<<"Podaj rok wydania :\n";
                cin>>s[i].rok;
                cout<<"Podaj cene :\n";
                cin>>s[i].cena;
            }

            ofstream plik;
            plik.open(argv[1]);
            for(int i=0;i<roz;++i)
            {
                plik<<s[i].numer<<endl;
                plik<<s[i].tytul<<endl;
                plik<<s[i].autor<<endl;
                plik<<s[i].rok<<endl;
                plik<<s[i].cena<<endl;
                plik<<"\n\n";
            }
            plik.close();
            delete [] s;
            break;
        }
        case 3:
        {
            cout<<"ksiazki w bazie :\n\n";

            int n = rozmiar(argv[1])-1;
            ksiazka *s = new ksiazka [n];
            zpliku(argv[1],s,n);
            wypisz(s,n);

            delete [] s;
            break;
        }

        case 4:
        {

            int n = rozmiar(argv[1])-1;
            ksiazka *s = new ksiazka [n];
            zpliku(argv[1],s,n);

            int ktory;
            cout<<"Ktora ksiazke usunac z bazy ?\n";
            cin>>ktory;
            usun(s,n,ktory);

            ofstream plik;
            plik.open(argv[1]);
            for(int i=0;i<n-1;++i)
            {
                plik<<s[i].numer<<endl;
                plik<<s[i].tytul<<endl;
                plik<<s[i].autor<<endl;
                plik<<s[i].rok<<endl;
                plik<<s[i].cena<<endl;
                plik<<"\n\n";
            }
            plik.close();

            delete [] s;
            break;
        }

        case 5:
        {
            cout<<"ksiazki z bazy posortowane po nazwie \n";
            int n = rozmiar(argv[1])-1;
            ksiazka *s = new ksiazka [n];
            zpliku(argv[1],s,n);
            sort2(s,n);
            wypisz(s,n);

            delete [] s;
            break;

        }

        case 0:
        {
            cout<<"Koniec \n";

            //break;
        }
    }
    }while(znak != 0);

    return 0;
} 

Pod linuksem kompiluje się ale przy włączeniu mam
"Naruszenie ochrony pamięci"
w dev c++ pod windowsem się nie kompiluje i są błędy

   cannot find -lmoldname 
  ld returned 1 exit status 

Proszę o pomoc

0

pewnie gdzieś przekraczasz zakres tablicy chyba ?
for(int i=0;i<n;++i) <- na pewno chcesz tak ? :
http://pytamy.pl/title,czym-w[...]nie.html?smclgnzlticaid=6d827

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