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') :
L'ho riscitta così e sembra funzionare:codice:if((compResult=(t_arg1->stipendio-t_arg2->stipendio))==0)
Però provando con questo file che ti allego: rinominalo in .bin, l'ordinamento non viene effettuato correttamente.codice:if((compResult=(static_cast<int>(t_arg1->stipendio)-static_cast<int>(t_arg2->stipendio)))==0)
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; }



Rispondi quotando