PDA

Visualizza la versione completa : [C++]Salvataggio Record da File Conservandone 2 su N che rispettano determinate Carat


Skull260287
16-06-2008, 20:37
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 (http://www.megaupload.com/it/?d=FRLPDW93)



/*
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

Loading