Vi allego esercizio da me svolto (e non funzionante) e traccia, non so per quale motivo ma l'ho trovato particolarmente complesso, oppure sono io che l'ho reso tale.

Il mio codice compila, crasha su stampa(temp); evidenziato nel codice, quindi penso ci sia un problema al momento della lettura. Poi il controllo per l'inserimento nonm ritengo funzioni anche se non sono riuscito a fare di meglio. Mi dareste una mano? Ah un file di prova potete scaricarlo qui

codice:
/*
   Note              : Sia assegnato il file libri.dat contenete recod del tipo
                       Rlibro; Se lo stato è >6 è accettabile). Un libro, con
                       u certo autore e titolo, può apparire più volte con 
                       diverso anno di edizione, prezzo e stato.
                       Scrivere una procedura che, per ogni autore e titolo,
                       conservi la prima e l'ultima edizione dei libri in
                       buono stato di conservazione; tali dati, ordinati per 
                       autore e, a parità, per titolo, devono essere scritti sul
                       file libri2.dat.
*/     

#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

struct Rlibro{
                                     int key;
                                     char autore[20];
                                     char titolo[20];
                                     char editore[20];
                                     int anno;
                                     float prezzo;
                                     int stato;
                                     };
typedef Rlibro* Plibro;     
                                
void Inserimento (Rlibro &, char &);
void getfile(Plibro [],int );
void putfile(Rlibro [],int ,int );
void stampa(Rlibro & stud);
void insort(Plibro [],int ,Plibro);
double Datanum(Rlibro );

const char Nomefile[ ]="libri.dat";
const int Lrec=sizeof(Rlibro);
const int Numpers=6;

int main(){
    
    char chr;
    Rlibro libro;
    
  /*
    int Numpers;
    cout<<"Numero di libri da inserire: ";
    cin>>Numpers;
    fstream filepers;
    filepers.open("libri.dat",ios::in|ios::out|ios::binary|ios::ate);
    if (!filepers)
     filepers.open("libri.dat",ios::out|ios::binary|ios::trunc);
    while(Numpers>0){
    Inserimento(libro,chr);
    if (chr=='s') {
    filepers.seekp(0,ios::end);
    filepers.write((char*)&libro,Lrec);
    Numpers--; 
    }}
    filepers.close();*/
    
     Plibro PuntaP1[101],PuntaP2[101];
     getfile(PuntaP1,Lrec);  
     //for(int k=1;k<=Numpers;k++){
        //     stampa(*PuntaP1[k]);
           //  }
     system("pause");
     //SortStud(PuntaP1,Numpers,true);
     //putfile(PuntaP1,Numpers,Lrec);
     
     for(int k=1;k<=Numpers;k++){
             stampa(*PuntaP1[k]);
             }
    
    
    system("pause");
    return 0;
    
}

   void Inserimento (Rlibro &pers1, char &ch)
   
{

   cout << "INSERIMENTO LIBRI" << endl << endl;
   cout << "Autore= ";
   cin >> pers1.autore;
   cout << "\nTitolo= ";
   cin >> pers1.titolo;
   cout << "\nEditore= ";
   cin >> pers1.editore;
   pers1.key=100;
   cout << "\nAnno= ";
   cin >> pers1.anno;
   cout << "\nPrezzo= ";
   cin >> pers1.prezzo;
   cout << "\nStato= ";
   cin >> pers1.stato;
   cout << "Salva (s/n)? ";
   cin >> ch;
   
}

void getfile(Plibro PuntaP1[],int Lrec){
     
     fstream file;
     Rlibro temp;
     file.open("libri.dat",ios::in|ios::out|ios::binary|ios::ate);
     if (!file)
     file.open("libri.dat",ios::out|ios::binary|ios::trunc);

     int Numstud=file.tellg()/Lrec;

     file.seekg(0,ios::beg);
     int k=1;
     for(int i=1;i<=Numstud;i++){
             
             file.read((char*) &temp,Lrec);
             if(temp.stato>6){
             stampa(temp);
             system("pause");
             PuntaP1[k]=new Rlibro;
             *PuntaP1[k]=temp;
             insort(PuntaP1,k,PuntaP1[k]);
             k++;
             }
     file.close(); 
     }
}

void insort(Plibro Punt[],int n,Plibro Temp){
     
     int j;
     Punt[0]=Temp;
     j=n-1;
     
    if(j>0 && stricmp(Punt[j]->autore,Punt[0]->autore)>0){
                  while(j>0 && stricmp(Punt[j]->autore,Punt[0]->autore)>0){
                  Punt[j+1]=Punt[j];
                  j--;
                  }
                  }
    if(j>0 && stricmp(Punt[j]->autore,Punt[0]->autore)==0 &&
               stricmp(Punt[j]->titolo,Punt[0]->titolo)<0){
                  while(j>0 && stricmp(Punt[j]->titolo,Punt[0]->titolo)<0){
                  Punt[j+1]=Punt[j];
                  j--;
                  } 
                  }  
     if(j>0 && stricmp(Punt[j]->titolo,Punt[0]->titolo)==0 && Punt[j]->anno>Punt[0]->anno
                && (Punt[j+1]->anno>Punt[0]->anno && stricmp(Punt[j]->autore,Punt[0]->autore)==0) ){
                  Punt[j]=Punt[0];
                  j=-1;                            
                  } 
     else if(j>0 && stricmp(Punt[j]->titolo,Punt[0]->titolo)==0 && Punt[j]->anno<Punt[0]->anno
                && (Punt[j-1]->anno<Punt[0]->anno && stricmp(Punt[j-1]->autore,Punt[0]->autore)==0) ){
                  Punt[j]=Punt[0];                          
                  }   
            Punt[j+1]=Punt[0];
     } 

void putfile(Plibro Punt[],int Numero,int Lrec){
     
     fstream file;
     file.open("libri2.dat",ios::out|ios::ate|ios::binary);
     
     if (!file)
      file.open("libri2.dat",ios::out|ios::binary|ios::trunc);
      
     for(int i=0;i<Numero;i++){
             file.write((char*) &*Punt[i],Lrec);
             }
}

void stampa(Rlibro &stud){
     
   cout<<"---"<<endl
        <<"Autore: "<<stud.autore<<endl
        <<"Titolo: "<<stud.titolo<<endl
        <<"Editore: "<<stud.editore<<endl
        <<"Anno: "<<stud.anno<<endl
        <<"Prezzo: "<<stud.prezzo<<endl
        <<"Stato: "<<stud.stato<<endl
        <<"---"<<endl;
}

Grazie Mille davvero