Sortowanie z pliku problem

0

Witam, mam do napisania baze danych, taka biblioteke ksiazek. Baza ta sklada sie z: wyswietlenia informacji o ksiazkach, dodawaniu, wyswietlaniu wg podanej informacji oraz posortowaniu. Problem pojawia sie przy posortowaniu. Z gory dzieki ;)


#include <iostream>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
#include <functional>

using namespace std;

int ile=0;

int ilosc()
{
	string linia;
    int licznik = 0;
    ifstream liczba("bibl.txt");
    while (getline(liczba, linia)) licznik ++;
    return licznik=(licznik/4);
    liczba.close();

}

struct ksiazka
{
    string tytul, autor;
    int rok_wydania;
    bool czy_do_archiwum;
};

void wyswietl(ksiazka *tab)
{

    ksiazka t[(ilosc())+ile];
    ifstream odczyt("bibl.txt");
    for(int i=0; i<(ilosc()); i++)
    {
        odczyt>>t[i].tytul;
        odczyt>>t[i].autor;
        odczyt>>t[i].rok_wydania;
        odczyt>>t[i].czy_do_archiwum;
    }
    cout<<left<<setw(20)<<"Tytul"<<left<<setw(25)<<"Autor"<<left<<setw(15)<<"Rok"<<left<<setw(10)<<"Archiwum"<<endl;

    for(int i=0; i<(ilosc()); i++)
    {

        cout<<setw(20)<<"_________________________________________________________________________________"<<endl;
        cout<<left<<setw(20)<<t[i].tytul<<setw(25)<<t[i].autor<<left<<setw(15)<<t[i].rok_wydania<<left<<setw(10)<<t[i].czy_do_archiwum<<endl;

    }
    odczyt.close();

}


void dodaj(ksiazka *tab)
{
ksiazka t[(ilosc())+ile];

int i;

system("cls");

cout<<"Podaj ilosc ksiazek ktore chcesz wprowadzic do bazy: ";
cin>>ile;

for (i=1; i<=ile;i++)
{

cout<<endl<<"Autor: ";
cin>>t[i].autor;

cout<<"Tytul: ";
cin>>t[i].tytul;

cout<<"Rok: ";
cin>>t[i].rok_wydania;

cout<<"Czy do archiwum: ";
cin>>t[i].czy_do_archiwum;

}

ofstream plik("bibl.txt",ios_base::app);

for (i=1; i<=ile;i++)
{
plik<<endl<< t[i].tytul<< endl;
plik<<t[i].autor << endl;
plik<<t[i].rok_wydania << endl;
plik<<t[i].czy_do_archiwum;

}

plik.close();

}

void sort(ksiazka *tab)
{
	ifstream odczyt("bibl.txt");
    ksiazka t[(ilosc())+ile];
	 for(int i=0; i<(ilosc()); i++)
    {
        odczyt>>t[i].tytul;
        odczyt>>t[i].autor;
        odczyt>>t[i].rok_wydania;
        odczyt>>t[i].czy_do_archiwum;
}
         
        
		sort(t,(t+ilosc()));}
				sort(t[i].rok_wydania.begin(), t[i+ilosc()].rok_wydania.end());
    		if(t[i].rok_wydania>t[i+1].rok_wydania)
    		{
    		swap(t[i].rok_wydania, t[i+1].rok_wydania);
                swap(t[i].tytul, t[i+1].tytul);
                swap(t[i].autor, t[i+1].autor);
                swap(t[i].czy_do_archiwum, t[i+1].czy_do_archiwum);
    		}
    	}
    		
    		 for( int i = 0; i <( ilosc()); i++ )
    	         cout<<"Tytul: "<<t[i].tytul<<endl;
		cout<<"Autor: "<<t[i].autor<<endl;
		cout<<"Rok wydania: "<<t[i].rok_wydania<<endl;
		cout<<"Archiwum: "<<t[i].czy_do_archiwum<<endl<<endl<<endl;
		

		}



		odczyt.close();
	}









/*void wypisz(ksiazka *tab)
{
	ksiazka t[(ilosc())+ile];
	ifstream odczyt("bibl.txt");
	for(int i=0; i<(ilosc()); i++)
    {
        odczyt>>t[i].tytul;
        odczyt>>t[i].autor;
        odczyt>>t[i].rok_wydania;
        odczyt>>t[i].czy_do_archiwum;
		cout<<"Tytul: "<<t[i].tytul<<endl;
		cout<<"Autor: "<<t[i].autor<<endl;
		cout<<"Rok wydania: "<<t[i].rok_wydania<<endl;
		cout<<"Archiwum: "<<t[i].czy_do_archiwum<<endl<<endl<<endl;
	}
	odczyt.close();
}*/




int main()
{
    ksiazka tab[(ilosc())+ile];
    int odp;

   do
   {
       cout<<endl<<"MENU"<<endl<<endl;
       cout<<"1. Wyswietl dane o ksiazkach "<<endl;
       cout<<"2. Dodaj ksiazke "<<endl;
       cout<<"3. Wyswietl ksiazke wedlug jednego z kryteriow "<<endl;
       cout<<"4. Posortuj wedlug wybranej informacji  "<<endl;
       cout<<"5. Koniec "<<endl<<endl;
       cin>>odp;
       switch(odp)
       {
           case 1: wyswietl(tab);
           break;
           case 2: dodaj(tab);
           break;
           case 3:
           	int h;
           	cout<<"1. Wg najmlodszej"<<endl;
           	cout<<"2. Wg autora"<<endl;
           	cout<<"3. Wg archiwum"<<endl;
           	cin>>h;
           	switch(h)
           	{
           		case 1: cout<<"Posortowane wg najmlodszej: "<<endl<<endl;
           		sort(tab); //wypisz(tab);
				break;
           		case 2: cout<<"Autor alfabetycznie: "<<endl;
           		break;
           		case 3: cout<<"Ilosc w archiwum malejąco: "<<endl;
			   }
			break;


           break;
           case 4:
		   int k;
		   cout<<"1. Wedlug roku"<<endl;
		   cout<<"2. Wedlug tytulu"<<endl;
		   cin>>k;
		   switch(k)
		   {
		   	case 1: cout<<"Rosnaco: ";
		   	break;
		   	case 2: cout<<"Od 'A' do 'Z' "<<endl;
		   	break;
		   }
           break;
           case 5: cout<<"Wyjscie z programu!"<<endl;
           break;
       }

   }
          while(odp!=5);

    return 0;
}
 
0

Zacznijmy od tego, że ten Twój kod to jakaś porażka:

1.Formatowanie na zasadzie kot przebiegł mi po klawiaturze.
2.ksiazka tab[(ilosc())+ile]; takiej konstrukcji nie ma (jeszcze) w C++ - wykorzystaj std::vector.
3.Co chwilę wykonujesz funkcję ilość(), która za każdym razem wczytuje plik od nowa po to tylko, aby się dowiedzieć, ile masz wierszy w już utworzonej tablicy (co w przypadku pętli daje złożoność kwadratową!) Wczytanie pliku raz i zapisanie szukanej wartości do zmiennej byłoby trudniejsze?
4.W każdej funkcji tworzysz tablicę, której nigdzie nie wykorzystujesz (funkcje automagicznie nie dzielą ze sobą żadnych zmiennych, jak zdajesz się myśleć).
5.Nie rozumiesz jak działa std::sort. Najpierw porób proste przykłady, a dopiero w następnej kolejności wykorzystuj funkcje we własnym kodzie.

Dalej kodu nie analizuję, ponieważ to mija się z celem - i tak jest cały do przepisania.

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