22/06/08 6:24
Linkage7th
Salve ragazzi,
devo consegnare un progetto per la gestione di un archivio ad accesso casuale. Ne ho scritto il codice, che ho controllato centinaia e centinaia di volte, ma proprio DevC++ (od anche Visual C++) non ne vuole sapere di eseguirlo, dato che mi dà sempre errori assurdi (tipo "cout undeclared - first use this function"!!)..
Sono davvero disperato, perché non so davvero più cosa fare...Sicuramente continuo a non accorgermi di qualche eventuale errore, ma senza un piccolo aiuto non credo di riuscirci.
Vi riporto integralmente il codice di seguito.
Spero davvero possiate aiutarmi, perché devo consegnare il tutto lunedì e al momento l'unica cosa che riesco a pensare è che ho buttato tanto tempo per niente
Ho riportato qualche commento, così da semplificarvi la lettura!
Vi ringrazio infinitamente in anticipo!!
devo consegnare un progetto per la gestione di un archivio ad accesso casuale. Ne ho scritto il codice, che ho controllato centinaia e centinaia di volte, ma proprio DevC++ (od anche Visual C++) non ne vuole sapere di eseguirlo, dato che mi dà sempre errori assurdi (tipo "cout undeclared - first use this function"!!)..
Sono davvero disperato, perché non so davvero più cosa fare...Sicuramente continuo a non accorgermi di qualche eventuale errore, ma senza un piccolo aiuto non credo di riuscirci.
Vi riporto integralmente il codice di seguito.
Spero davvero possiate aiutarmi, perché devo consegnare il tutto lunedì e al momento l'unica cosa che riesco a pensare è che ho buttato tanto tempo per niente
//Gestione archivio accesso casuale //file main.cpp #include "archindex.h" #include "Record.h" #include >iostream.h> using std::cout; using std::cin; enum {DIM_nomeFile=15}; void main(){ char nomeFile[DIM_nomeFile], nomeIndice[DIM_nomeFile]; int scelta, esci=0 int rec_tot, rec_validi; Record rec; char chiave_rec[DIM_chiave]; cout<<"Software gestionale centro sportivo"<<endl; cout<<"Inserire il nome dell\'archivio:"; cin.getline(nomeFile,DIM_nomeFile-1); strcpy(nomeIndice, nomeFile); strcat(nomeIndice, ".IND"); Archindex.ai(nomeFile, nomeIndice); while(!uscita) { do { cout<<[1]"INSERIRE NUOVO ISCRITTO\n"; cout<<[2]"ELIMINAZIONE UTENTE\n"; cout<<[3]"RICERCA, SELEZIONA E STAMPA UTENTE\n"; cout<<[4]"MODIFICA UTENTE\n"; cout<<[5]"RIPRISTINA UTENTE\n"; cout<<[6]"STATO ARCHIVIO\n"; cout<<[7]"RIORGANIZZAZIONE ARCHIVIO\n"; cout<<[8]"VISUALIZZA INTERO ARCHIVIO\n"; cout<<[9]"USCITA\n"; COUT<<"Seleziona un\'opzione: "; cin>>scelta; }while((scelta<1)||(scelta>9)); switch(scelta){ case 1: cout<<"Operazione scelta: inserimento"<<endl; rec.leggi_da_tastiera(); ai.aggiunta_record(rec); break; case 2: cout<<"Operazione scelta: eliminazione"<<endl; cout<<"Inserire chioave: ";cin.getline(chiave_rec,DIM_chiave-1); if(ai.cancellazione_logica(chiave_rec)) cout>>"Utente eliminato"<<endl; break; case 3: cout<<"Operazione scelta: ricerca, selezione e stampa"<<endl; cout<<"Inserire chiave: "; cin.getline(chiave_rec, DIM_chiave-1); rec=ai.ricerca_record(chiave_rec); rec.stampa(); break; case 4: cout<<"Operazione scelta: modifica"<<endl; cout<<"Inserire chiave: ";cin.getline(chiave_rec,DIM_chiave-1); ai.modifica_record(chiave_rec); case 5: cout<<"Operazione scelta: ripristina"<<endl; cout<<"Inserire chiave: ";cin.getline(chiave_rec, DIM_chiave-1); ai.ripristina_record(chiave_rec); break; case 6: cout<<"Operazione scelta: stato archivio"<<endl; ai.get_stato(rec_tot,rec_validi); cout<<"\t Numero utenti iscritti: "<<rec_tot; cout<<"\t Numero utenti validi: "<<rec_validi<<endl; cin.get(); break; case 7: cout<<"Operazione scelta: riorganizzazione archivio"<<endl; ai.riorganizzazione(); break; case 8: cout<<"Operazione scelta: visualizzazione"<<endl; ai.visita_ordinata(); cin.get; break; case 9: cout<<"Uscita..."<<endl; esci=true; break; } } } // Classe Record:specifica e implementazione // Nome del file Record.h #ifndef Record_H #define Record_H #include <string.h> #include <iostream.h> enum {DIM_chiave=20}; enum {DIM_nome=20}; enum {DIM_cognome=20}; enum {DIM_sesso=1}; enum {DIM_datanascita=11}; enum {DIM_codfiscale=16}; enum {DIM_certificato=2}; enum {DIM_indirizzo=40}; enum {DIM_professione=15}; enum {DIM_attivita=12}; enum {DIM_telefono=20}; enum {DIM_abbonamento=10}; enum {DIM_pagamento=2}; class Record { public: char chiave[DIM_chiave] ; char nome[DIM_nome]; char cognome[DIM_cognome]; char sesso[DIM_sesso]; char datanascita[DIM_datanascita]; char codfiscale[DIM_codfiscale]; char certificato[DIM_certificato]; char indirizzo[DIM_indirizzo]; char professione[DIM_professione]; char attivita[DIM_attivita]; char telefono[DIM_telefono]; char abbonamento[DIM_abbonamento]; char pagamento[DIM_pagamento]; Record(){} Record( const char*CHIAVE, const char*NOME, const char*COGNOME, const char*SESSO, const char*DATANASCITA, const char*CODFISCALE, const char*CERTIFICATO, const char*INDIRIZZO, const char*PROFESSIONE, const char*ATTIVITA, const char*TELEFONO, const char*ABBONAMENTO, const char*PAGAMENTO){ strcpy(chiave,CHIAVE); strcpy(nome,NOME); strcpy(cognome,COGNOME); strcpy(sesso,SESSO); strcpy(datanascita,DATANASCITA); strcpy(codfiscale,CODFISCALE); strcpy(certificato,CERTIFICATO); strcpy(indirizzo,INDIRIZZO); strcpy(professione,PROFESSIONE); strcpy(attività,ATTIVITA); strcpy(telefono,TELEFONO); strcpy(abbonamento,ABBONAMENTO); strcpy(pagamento,PAGAMENTO); } void stampa() const{ cout<<"\n----------Iscritto--------"; cout<<"\n CODICE ISCRITTO: " <<chiave; cout<<"\n NOME: " <<nome; cout<<"\n COGNOME: " <<cognome; cout<<"\n SESSO: " <<sesso; cout<<"\n DATA DI NASCITA: " <<datanascita; cout<<"\n CERTIFICATO: " <<certificato; cout<<"\n CODICE FISCALE: " <<codfiscale; cout<<"\n INDIRIZZO: " <<indirizzo; cout<<"\n PROFESSIONE: " <<professione; cout<<"\n ATTIVITÀ: " <<attivita; cout<<"\n TELEFONO: " <<telefono; cout<<"\n ABBONAMENTO: " <<abbonamento; cout<<"\n PAGAMENTO: " <<pagamento; cout<<"\n----------------------"<<endl;} void leggi_da_tastiera(){ cout<<flush; cout<<"\n----------Lettura_Iscritto--------"; cout<<"\n CODICE ISCRITTO: ";cin.getline(chiave,DIM_chiave-1); cout<<"\n NOME: ";cin.getline(nome,DIM_nome-1); cout<<"\n COGNOME: ";cin.getline(cognome,DIM_cognome-1); cout<<"\n SESSO: ";cin.getline(sesso,DIM_sesso-1); cout<<"\n DATA DI NASCITA: ";cin.getline(datanascita,DIM_datanascita-1); cout<<"\n CERTIFICATO: ";cin.getline(certificato,DIM_certificato-1); cout<<"\n CODICE FISCALE: ";cin.getline(codfiscale,DIM_codfiscale-1); cout<<"\n INDIRIZZO: ";cin.getline(indirizzo,DIM_indirizzo-1); cout<<"\n PROFESSIONE: ";cin.getline(professione,DIM_professione-1); cout<<"\n ATTIVITÀ: ";cin.getline(attivita,DIM_attivita-1); cout<<"\n TELEFONO: ";cin.getline(telefono,DIM_telefono-1); cout<<"\n ABBONAMENTO: ";cin.getline(abbonamento,DIM_abbonamento-1); cout<<"\n PAGAMENTO: ";cin.getline(pagamento,DIM_pagamento-1); cout<<"\n----------------------"<<endl;} void modifica(){ int scelta; cout<<"\n----------Modifica_ Iscritto--------"; cout<<"\n (1) CODICE ISCRITTO: " <<chiave; cout<<"\n (2) NOME: " <<nome; cout<<"\n (3) COGNOME: " <<cognome; cout<<"\n (4) SESSO: " <<sesso; cout<<"\n (5) DATA DI NASCITA: " <<datanascita; cout<<"\n (6) CERTIFICATO: " <<certificato; cout<<"\n (7) CODICE FISCALE: " <<codfiscale; cout<<"\n (8) INDIRIZZO: " <<indirizzo; cout<<"\n (9) PROFESSIONE: " <<professione; cout<<"\n (10) ATTIVITÀ: " <<attivita; cout<<"\n (11) TELEFONO: " <<telefono; cout<<"\n (12) ABBONAMENTO: " <<abbonamento; cout<<"\n (13) PAGAMENTO: " <<pagamento; cout<<"\n----------------------"<<endl; cout<<"\n Cosa desideri modificare? "; cout<<flush; do { cout<<" (1-13):";cin>>scelta;} while((scelta<1)&&(scelta>13)); switch (scelta){ case 1:cout<<"\n CODICE ISCRITTO: ";cin.getline(chiave,DIM_chiave-1); break; case 2:cout<<"\n NOME: ";cin.getline(nome,DIM_nome-1); break; case 3:cout<<"\n COGNOME: ";cin.getline(cognome,DIM_cognome-1); break; case 4:cout<<"\n SESSO: ";cin.getline(sesso,DIM_sesso-1); break; case 5:cout<<"\n DATA DI NASCITA: ";cin.getline(datanascita,DIM_datanascita-1); break; case 6:cout<<"\n CERTIFICATO: ";cin.getline(certificato,DIM_certificato-1); break; case 7:cout<<"\n CODICE FISCALE: ";cin.getline(codfiscale,DIM_codfiscale-1); break; case 8:cout<<"\n INDIRIZZO: ";cin.getline(indirizzo,DIM_indirizzo-1); break; case 9:cout<<"\n PROFESSIONE: ";cin.getline(professione,DIM_professione-1); break; case 10:cout<<"\n ATTIVITÀ: ";cin.getline(attivita,DIM_attivita-1); break; case 11:cout<<"\n TELEFONO: ";cin.getline(telefono,DIM_telefono-1); break; case 12:cout<<"\n ABBONAMENTO: ";cin.getline(abbonamento,DIM_abbonamento-1); break; case 13:cout<<"\n PAGAMENTO: ";cin.getline(pagamento,DIM_pagamento-1); break; } } }; #endif // Classe nt: specifica (non è prevista implementazione) file: nT.h #include "Record.h" struct nT; typedef nT* puntnT; struct nT { char chiave[DIM_chiave]; long int indirizzo; bool valido; puntnT puntatore; }; #include "nT.h" class Tabella{ private: enum{AGGIORNATO=0, NON_AGGIORNATO=1} update; char*nome_file_indice; int num_elem_totali; int num_elem_validi; puntnT primo; puntnT ultimo; puntnT punt_corrente; //Classe Tabella //nome file: Tabella.h #include "nT.h" class Tabella{ private: enum{AGGIORNATO=0, NON_AGGIORNATO=1} update; char*nome_file_indice; int num_elem_totali; int num_elem_validi; puntnT primo; puntnT ultimo; puntnT punt_corrente; public: Tabella(const char*); ~Tabella(); bool cerca_chiave (const char*chiave, long int & indirizzo); void inserisce (const char*chiave, const long & indirizzo); bool elimina_chiave (const char*chiave); bool cerca_rec_cancellato (const char*chiave, long int & indirizzo); puntnT cerca_primo(); puntnT cerca_successivo(); int record_complessivi()const; int record_validi()const; bool inserisce_r_cancellato(const char*chiave); void stampa_indice()const; void elimina_nodoTabella (puntnT &prec, puntnT &punt); }; //classe Archivio //nome file: Archivio.h #ifndef Archivio_H #define Archivio_H #include <fstream.h> class Archivio { private: int dimrec; fstream file; char*nomefile; public: Archivio(const char* NOMEFILE="",int LUNG_DATI=0); void modifica_record(const long int pos,const char* record); void inserisce(const char*record,long int &pos); void get_record(const long int pos, char*record); void rinomina_file_temp (const char*nome_file_temp); ~Archivio(); }; #endif //classe Archindex //nome file: archindex.h #ifndef ARCHINDEX_H #define ARCHINDEX_H #include "Tabella.h" #include "Archivio.h" class Archindex{ private: Archivio archivio; Tabella indice; public: Archindex(const char* NOMEARCHIVIO, const char* NOMEINDICE): archivio(NOMEARCHIVIO, LUNG_REC), indice (NOMEINDICE){} void aggiunta_record(const Record nom); Record ricerca_record (const char*chiave); bool modifica_record (const char*chiave); bool cancellazione_logica (const char*chiave); bool ripristina_record (const char*chiave); void visita_ordinata(); void riorganizazione(); void get_stato(int & num_rec_totali, int & num_rec_validi)const;}; #endif #endif //classe Tabella: implementazione //nome file: Tabella.cpp #include<string.h> #include<iostream.h> #include<fstream.h> #include "Tabella.h" Tabella::Tabella(const char*INDICE){ fstream file; int dimrec=sizeof(nT); int cont=0; int non_validi=0; nT *ptrhis,*ptrnew,*punt; nome_file_indice=new char[strlen(INDICE)+1]; strcpy(nome_file_indice, INDICE); update=AGGIORNATO; primo=ultimo=0; file.open(nome_file_indice, ios::binary|ios::in|ios::nocreate); if(!file) cout<<"\n creazione nuovo indice \n"; else{ primo= new nT; ptrthis=primo; punt=primo; cont=0; while(!file.eof()&&(punt!=0)){ file.read(reinterpret_cast<char*>(ptrthis),dimrec; if(!ptrthis->valido) non_validi++; punt=ptrthis->puntatore; if(ptrthis->puntatore!=0){ ptrnew=new nT; ptrthis->puntatore=ptrnew; ptrthis=ptrnew; } cont++; } ultimo=ptrthis; } punt_corrente=primo; num_elem_totali=cont; num_elem_validi=num_elem_totali-non_validi; file.close(); } void Tabella::stampa_indice() const{ puntnT q; q=primo; while(q!=0){ cout<<"\n-----------------------"; cout<<"\n CODICE ISCRIZIONE: "<<q->chiave; cout<<"\n Posizione del Recordnel file: "<<q->indirizzo; cout<<"\n Puntatore "<<q->puntatore; cout<<"\t valido: "<<q->valido; cout<<"\n ----------------------"; q=q->puntatore; } } //Distruttore Tabella::~Tabella(){ fstream file; int dimrec=sizeof(nT); puntnT ptrthis; if(update==NON_AGGIORNATO) { file.open(nome_file_indice,ios::binary|ios::out); if(!file) cout<<"\n impossibile salvare il file a indice\n"; else { ptrthis=primo; while(ptrthis!=0){ file.write( reinterpret_cast<char*>(ptrthis),dimrec); } } file.close(); } } bool Tabella::cerca_chiave (const char*chiave,long int & indirizzo) { bool trovato=false; puntnT q; q=primo; while (!trovato && q!=0) { if(strcmp(chiave,q->chiave)) q=q->puntatore; else { if(q->valido==true) { trovato=true; indirizzo=q->indirizzo; punt_corrente=q; } } } return trovato; } void Tabella::inserisce (const char*chiave, const long int indirizzo) { puntnT prec,curr,pnew; pnew=new nT; strcpy (pnew->chiave,chiave); pnew->indirizzo=indirizzo; pnew->valido=true; pnew->puntatore=0; punt_corrente=pnew; update=NON_AGGIORNATO; prec=primo; curr=primo; if(num_elem_totali>0){ if(strcmp(primo->chiave,chiave)>=0){ pnew->puntatore=primo; primo=pnew; }else{ curr=curr->puntatore; while((curr!=0)&& (strcmp(curr->chiave,chiave)<0)){ prec=curr; curr=curr->puntatore; } if(curr!=0){ pnew->puntatore=curr; prec->puntatore=pnew; }else{ ultimo->puntatore=pnew; ultimo=pnew; } } }else{ cout<<"Lista vuota"<<endl; primo=pnew; ultimo=primo; cout<<"primo->puntatore"<<primo->puntatore; } num_elem_totali++; num_elem_validi++; } bool Tabella::elimina_chiave(const char*chiave){ bool trovato=false; puntnT=q; q=primo; while (!trovato && q!=0){ if (strcmp(chiave,q->chiave)!=0) q=q->puntatore; else{ punt_corrente=q; q->valido=false; num_elem_validi--; update=NON_AGGIORNATO; trovato=true; } } return trovato; } puntnT Tabella::cerca_primo(){ punt_corrente=primo; return punt_corrente; } puntnT Tabella::cerca_successivo(){ punt_corrente=punt_corrente->puntatore; return punt_corrente; } int Tabella::record_complessivi()const{ return num_elem_totali; } int Tabella::record_validi()const{ return num_elem_validi; } bool Tabella::cerca_rec_cancellato(const char*chiave, long int&indirizzo){ bool trovato=false; puntnT q; q=primo; while (!trovato&&q!=0){ if(strcmp(chiave,q->chiave)) q=q->puntatore; else { if (q->valido==false){ trovato=true; indirizzo=q->indirizzo; punt_corrente=q; } } } return trovato } bool Tabella::inserisce_r_cancellato(const char* chiave){ bool risultato=false; bool trovato=false; puntnT q; q=primo; while (!trovato && q!=0) { if (strcmp(chiave, q->chiave)!=0) q=q->puntatore; else { punt_corrente=q; q->valido=true; num_elem_validi++; update=NON_AGGIORNATO; trovato=true; } } return trovato; } void Tabella::elimina_nodoTabella (puntnT &prec, puntnT &punt) { puntnT temp; if num_elem_totali!=0){ temp=punt; punt=punt->puntatore; if (primo==temp) primo=temp->puntatore; else prec->puntatore=temp->puntatore; num_elem_totali--; if (temp->valido) num_elem_validi--; update=NON_AGGIORNATO; delete temp; } } //classe Archivio implementazione //file: Archivio.cpp #include "Archivio.h" #include <stdio.h> #include <string.h> Archivio::Archivio(const char* NOMEFILE,int LUNG_DATI) { dimrec=LUNG_DATI; nomefile=new char[strlen(NOMEFILE)+1]; strcpy(nomefile, NOMEFILE); file.open(nomefile,ios::binary|ios::in|ios::out|ios::nocreate); if(!file){ file.open(nomefile, ios::binary|ios::in|ios::out); cout<<"\n Gestione nuovo file "; } else { cout<<"\n Gestione di un file già esistente "; } } void Archivio::inserisce(const char*record,long int &pos){ file.seekp(0, ios::end); pos=static_cast<long int> (file.tellp()); cout<<" pos = "<<pos<<" \tdimrec "<<dimrec<<endl; cin.get(); if(file.is_open()){ file.write(reinterpret_cast<const char*> (record), dimrec); cout<<" Inserimento effettuato con successo "<<endl;} else cout<<" Inserimento non effetuato "<<endl; } void Archivio::get_record(const long int pos, char*dati){ file.seekg(pos,ios::beg); file.read(reinterpret_cast<char*> (dati), dimrec); } void Archivio::modifica_record (const long int pos, char* record){ file.seekp(pos,ios::beg); file.write(record, dimrec);} void Archivio::rinomina_file_temp(const char*file_temp){ file.close(); remove(nomefile); rename(file_temp, nomefile); file.open(nomefile,ios::binary|ios::in|ios::out|ios::nocreate); } Archivio::~Archivio(){ file.close(); delete nomefile; } //Classe Archindex: implementazione //file: Archindex.cpp #include "archindex.h" bool Archindex::cancellazione_logica(const char*chiave){ bool risultato=false; if(indice.elimina_chiave(chiave)) risultato=true; return risultato;} bool Archindex::ripristina_record (const char*chiave){ bool risultato; if(risultato=indice.inserisce_r_cancellato(chiave)) cout<<" Utente Ripristinato "<<endl; else cout<<" Utente non presente "<<endl; return risultato; } void Archindex::get_stato(int& num_rec_totali, int& num_rec_validi) const { indice.stampa_indice(); num_rec_totali=indice.record_complessivi(); num_rec_validi=indice.record_validi(); } void Achindex::aggiunta_record( const Record nom) { long int indirizzo; cout<<" Inserisce Archivio "<<endl; archivio.inserisce (reinterpret_cast<const char*>(& nom)indirizzo); cout<<" Inserisce in tabella "<<endl; indice.inserisce (nom.chiave,indirizzo++); } bool Archindex::modica_record(const char*chiave){ long int pos; bool risultato=false; char rec[LUNG_REC]; if (indice.cerca_chiave(chiave,pos)){ archivio.get_record(pos,rec); Record nom= *(reinterpret_cast<Record*>(rec)); nom.modifica(); archivio.modifica_record(pos, reinterpret_cast<const char*>(&nom)); cout<<" Modifica Terminata "<<endl; risultato=true; } return risultato; } void Archindex::riorganizzazione(){ int validi, totali; long int new_ind; fstream temp; nT *punt, *prec; char rec[LUNG_REC]; totali=indice.record_complessivi(); validi=indice.record_validi(); if (totali>validi){ temp.open("rubrica.bak",ios::binary|ios::out); if (!temp){ cout<<" Errore nell\'apertura file "<<endl; return; } punt=indice.cerca_primo(); prec=punt; while (punt!=0){ if (punt->valido==true){ archivio.get_record(punt->indiizzo,rec); new_ind= static_cast<long int>(temp.tellp()); temp.write(reinterpret_cast<const char*> (rec),LUNG_REC); punt->indirizzo=new_ind; prec=punt; punt=punt->puntatore; } else{ indice.elimina_nodoTabella(prec,punt); indice.stampa_indice(); } } temp.close(); archivio.rinomina_file_temp("rubrica.bak"); } else { cout<<" Compattazione non necessaria "<<endl; } } void Archindex::visita_ordinata(){ nT *punt; Record nom; punt=indice.cerca_primo(); cout<<" Visualizza intero archivio "<<endl; while (punt!=0){ if (punt->valido){ archivio.get_record(punt->indirizzo, reinterpret_cast<char*>(&nom)); nom.stampa(); } punt=indice.cerca_successivo(); } } Record Archindex::ricerca_record(const char* chiave){ long int pos; Record nom; if (indice.cerca_chiave(chiave, pos)) archivio.get_record(pos, reinterpret_cast<char*>(&nom)); cout<<" Posizione elemento da ricercare = "<<pos<<endl; return nom; }
Ho riportato qualche commento, così da semplificarvi la lettura!
Vi ringrazio infinitamente in anticipo!!
aaa