#include <iostream>
#include <fstream>
#include <limits>

using namespace std; // w starszych kompilatorach trzeba zakomentować ten wiersz

void Drukuj(char **T,unsigned N)
  {
   unsigned i=0;
   for(char **K=T+N;T<K;++T) cout<<"T["<<(++i)<<"]=\""<<*T<<"\";"<<endl;
  }

void Zwolnij(char **T,unsigned N)
  {
   if(N)
     {
      for(char **K=T+(N-1);T<=K;--K) delete[] *K;
      delete[] T;
     }
  }

void Sortuj(char **T,unsigned N)
  {
   for(unsigned k=N-1;k>0;--k)
     {
      bool f=true;
      for(unsigned i=0;i<k;++i)
        {
         if(strcmp(T[i],T[i+1])>0)
           {
            char *tmp=T[i]; T[i]=T[i+1]; T[i+1]=tmp;
            f=false;
           }
        }
      if(f) break;  
     }
  }

void Wprowadz(char **&T,unsigned &N)
  {
   while(true)
     {
      cout<<"Podaj napis nr "<<(N+1)<<" (pusty koniec): ";
      char Bufor[1024];
      cin.getline(Bufor,1024,'\n');
      if(*Bufor)
        {
         char **NT=new char*[N+1];
         if(T)
           {
            memcpy(NT,T,N*sizeof(char*));
            delete[] T;
           }
         T=NT;
         T[N++]=strdup(Bufor);
        }
      else break;
     }
  }

void Zapisz(char **T,unsigned N)
  {
   fstream fout;
   fout.open("test.ini",ios::out|ios::binary);
   fout.write((char*)&N,sizeof(N));
   for(char **K=T+N;T<K;++T)
     {
      unsigned Len=strlen(*T);
      fout.write((char*)&Len,sizeof(Len));
      fout.write(*T,Len);
     }
   fout.close();
  }

void Wczytaj(char **&T,unsigned &N)
  {
   fstream fin;
   fin.open("test.ini",ios::in|ios::binary);
   fin.read((char*)&N,sizeof(N));
   T=new char*[N];
   for(unsigned i=0;i<N;++i)
     {
      unsigned Len;
      fin.read((char*)&Len,sizeof(Len));
      T[i]=new char[Len+1];
      fin.read(T[i],Len);
      T[i][Len]=0;
     }
   fin.close();
  }

int main()
  {
   unsigned Ilosc=0;
   char **T=0;
   Wczytaj(T,Ilosc);
   while(true)
     {
      cout<<"0. wyjscie"<<endl;
      cout<<"1. wprowadzenie"<<endl;
      cout<<"2. drukowanie"<<endl;
      cout<<"3. kasowanie"<<endl;
      cout<<"4. sortowanie"<<endl;
      int Ch=cin.get();
      if(Ch!='\n') cin.ignore(INT_MAX,'\n');
      switch(Ch)
        {
         case '0': Zapisz(T,Ilosc); Zwolnij(T,Ilosc); return 0;
         case '1': Wprowadz(T,Ilosc); break;
         case '2': Drukuj(T,Ilosc); break;
         case '3': Zwolnij(T,Ilosc); T=0; Ilosc=0; break;
         case '4': Sortuj(T,Ilosc); break;
        }
      cout<<endl;  
     }
  }


