Ciao, grazie, ho studiato la funzione ed ho capito come utilizarla. Su questa riga il mio compilatore (Dev-C++) mi da errore ([Warning] converting to `int' from `double') :
codice:
if((compResult=(t_arg1->stipendio-t_arg2->stipendio))==0)
L'ho riscitta così e sembra funzionare:
codice:
if((compResult=(static_cast<int>(t_arg1->stipendio)-static_cast<int>(t_arg2->stipendio)))==0)
Però provando con questo file che ti allego: rinominalo in .bin, l'ordinamento non viene effettuato correttamente.
Ecco il codice che ho utilizzato:
codice:
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct Tipostud{
char Nome[20];
char Cognome[20];
int anno;
int mese;
int giorno;
char Ruolo[20];
double stipendio;
};
typedef Tipostud* Pstud;
void Inserimento (Tipostud &, char &);
void getfile(Pstud [],int );
void putfile(Pstud [],int ,int );
void stampa(Tipostud & stud);
void SortStud(Tipostud ** array, size_t elements);
int StudCompare( const void *arg1, const void *arg2 );
const char Nomefile[ ]="studenti2.bin";
const int Lrec=sizeof(Tipostud);
const int Numpers=8;
int main(){
char chr;
Tipostud studente;
/*
int Numpers;
cout<<"Numero di persone da inserire: ";
cin>>Numpers;
fstream filepers;
filepers.open("studenti.bin",ios::in|ios::out|ios::binary|ios::ate);
if (!filepers)
filepers.open("studenti.bin",ios::out|ios::binary|ios::trunc);
while(Numpers>0){
Inserimento(studente,chr);
if (chr=='s') {
filepers.seekp(0,ios::end);
filepers.write((char*)&studente,Lrec);
Numpers--;
}}
filepers.close();*/
Pstud PuntaP1[101];
getfile(PuntaP1,Lrec);
SortStud(PuntaP1,Numpers);
putfile(PuntaP1,Numpers,Lrec);
for(int k=1;k<=Numpers;k++){
stampa(*PuntaP1[k]);
}
system("pause");
return 0;
}
void Inserimento (Tipostud &pers1, char &ch)
{
cout << "INSERIMENTO PERSONE" << endl << endl;
cout << "Cognome= ";
cin >> pers1.Cognome;
cout << "Nome= ";
cin >> pers1.Nome;
cout << "Data di Nascita (GG MM AAAA)= ";
cin >> pers1.giorno >> pers1.mese >> pers1.anno;
cout << "Ruolo= ";
cin >> pers1.Ruolo;
cout << "Stipendio= ";
cin >> pers1.stipendio;
cout << "Salva (s/n)? ";
cin >> ch;
}
void getfile(Pstud PuntaP1[],int Lrec){
fstream file;
Tipostud studente;
file.open("studenti2.bin",ios::in|ios::out|ios::binary|ios::ate);
if (!file)
file.open("studenti2.bin",ios::out|ios::binary|ios::trunc);
int Numstud=file.tellg()/Lrec;
file.seekg(0,ios::beg);
for(int i=1;i<=Numstud;i++){
file.read((char*) &studente,Lrec);
PuntaP1[i]=new Tipostud;
*PuntaP1[i]=studente;
}
file.close();
}
void SortStud(Tipostud ** array, size_t elements)
{
qsort((void *)array,elements,sizeof(*array), StudCompare);
}
int StudCompare(const void *arg1, const void *arg2)
{
Tipostud * t_arg1=*(Tipostud **)arg1, * t_arg2=*(Tipostud **)arg2;
int compResult;
if((compResult=(static_cast<int>(t_arg1->stipendio)-static_cast<int>(t_arg2->stipendio)))==0)
{
if((compResult=stricmp(t_arg1->Cognome,t_arg2->Cognome))==0)
{
if((compResult=(t_arg1->anno-t_arg2->anno))==0)
{
if((compResult=(t_arg1->mese-t_arg2->mese))==0)
{
if((compResult=(t_arg1->giorno-t_arg2->giorno))==0)
{
return 0;
}
}
}
}
}
return compResult;
}
void putfile(Pstud Punt[],int Numero,int Lrec){
fstream file;
file.open("studenti.bin",ios::out|ios::ate|ios::binary);
if (!file)
file.open("studenti.bin",ios::out|ios::binary|ios::trunc);
for(int i=1;i<=Numero;i++){
file.write((char*) &*Punt[i],Lrec);
}
}
void stampa(Tipostud & stud){
cout<<"---"<<endl
<<"Stipendio: "<<stud.stipendio<<endl
<<"Cognome: "<<stud.Cognome<<endl
<<"Data di nascita: "<<stud.giorno<<"/"<<stud.mese<<"/"<<stud.anno<<endl
<<"---"<<endl;
}