02/06/10 23:52
stefanopeppy
Salve ragazzi, mi chiamo Stefano e sono nuovo; sono iscritto da molto ma per vari motivi non frequento il forum.
Adesso però ho davvero bisogno di voi.
Sto facendo una piccolo programma che gestisce un archivio in c++.
Sono riuscito a fare tutte le varie procedure tranne una: "L'ordinamento".
Vi spiego:
Nel mio codice ho una funzione che mi calcola quanti record ho nel file.
Secondo la mia opinione potrei tranquillamente creare un vettore di dimensione "Nrec", calcolata con la funzione; ordinare il vettore e riscrivere il tutto sull'archivio.
Purtroppo non lo posso fare perchè le disposizioni della mia prof sono ben diverse:
Devo creare un vettore di "LenMax", in cui copio massimo "LenMax" elementi dall'archivio li ordino e per ogni "LenMax" elementi creo un sottofile. Alla fine dovrò fonderli insieme.
Scusatemi se mi sono espresso male, spero di aver reso l'idea.
Ho abbozzato una procedura che:
- Copia nel vettore i primi "LenMax" elementi;
- Li ordina, e li scrive su un file temporaneo.
Tutto in un ciclo che cicla finche un indice non raggiunge il numero calcolato dei "sottofile".
Vi posto la mia procedura:
Il primo sottofile lo crea bene e lo ordina bene, i restanti "n" no.
Se non inizia a creare bene i sottofile non posso proprio cimentarmi nella fusione.
Grazie a chiunque mi aiuterà ed anche a chi ha solo letto la mia richiesta.
Spero in un vostro aiuto.
Stefano Santomartino
Adesso però ho davvero bisogno di voi.
Sto facendo una piccolo programma che gestisce un archivio in c++.
Sono riuscito a fare tutte le varie procedure tranne una: "L'ordinamento".
Vi spiego:
Nel mio codice ho una funzione che mi calcola quanti record ho nel file.
Secondo la mia opinione potrei tranquillamente creare un vettore di dimensione "Nrec", calcolata con la funzione; ordinare il vettore e riscrivere il tutto sull'archivio.
Purtroppo non lo posso fare perchè le disposizioni della mia prof sono ben diverse:
Devo creare un vettore di "LenMax", in cui copio massimo "LenMax" elementi dall'archivio li ordino e per ogni "LenMax" elementi creo un sottofile. Alla fine dovrò fonderli insieme.
Scusatemi se mi sono espresso male, spero di aver reso l'idea.
Ho abbozzato una procedura che:
- Copia nel vettore i primi "LenMax" elementi;
- Li ordina, e li scrive su un file temporaneo.
Tutto in un ciclo che cicla finche un indice non raggiunge il numero calcolato dei "sottofile".
Vi posto la mia procedura:
void Ordinamento(FILE* Archivio, T_Nominativo Record) { // Vettore Da ordinare = contiene "LENGTH_ORDINAMENTO" record presi dall'archivio T_Nominativo Ordinare[LENGTH_ORDINAMENTO]; T_Nominativo AppSottofile; int Nrec = NumeroRecord(Archivio, Record); int Sottoarchivi = (Nrec)/(LENGTH_ORDINAMENTO); // Sottoarchivio aggiuntivo nel caso in cui il resto tra Nrec/LENGTH_ORDINAMENTO sia maggiore di 0 if((Nrec%LENGTH_ORDINAMENTO)>0) Sottoarchivi++; int I=0; // Indice Crea Sottoarchivi int J=0; // Indice copia nel vettore int K=0; // Indice Scrittura Sottoarchivi bool copiato = 0; // E' Stato copiato? int IndicePosizioneLetturaSottofile = 0; // fseek int RecordCopiati = 0; // Quanti ne copia char NomeFisicoApp[9]; NomeFisicoApp[0] = 'T'; NomeFisicoApp[1] = 'E'; NomeFisicoApp[2] = 'M'; NomeFisicoApp[3] = 'P'; NomeFisicoApp[4] = '_'; NomeFisicoApp[5] = 'A'; NomeFisicoApp[6] = '.'; NomeFisicoApp[7] = 'd'; NomeFisicoApp[8] = 'a'; NomeFisicoApp[9] = 't'; while(I<Sottoarchivi) { FILE* App; App = fopen(NomeFisicoApp,"w+"); Archivio = fopen(FILE_NAME,"r+"); if(!Archivio) { Gotoxy(q,y+10); cout << "ERRORE ARCHIVIO PRINCIPALE"; }else if(!App) { Gotoxy(q,y+10); cout << "ERRORE FILE D'APPOGGIO"; }else { /* Prelevo Record da "Archivio" */ J=0; copiato = 0; while(J<LENGTH_ORDINAMENTO) { /* Copio nel vettore */ fseek(Archivio,sizeof(Record)*IndicePosizioneLetturaSottofile,0); /* Ad ogni record letto passa a quello successivo, lo farebbe normalmente la funzione fread però nel ciclo la posizione viene cambiata e quindi ne tengo conto qui*/ fread(&Record,sizeof(Record),1,Archivio); Ordinare[J] = Record; // Mette correttamente i record nel vettore J++; copiato = 1; IndicePosizioneLetturaSottofile++; } /* Se il vettore è stato riempito */ if(copiato==1){ /* Ordino il vettore */ for(int A=0;A<LENGTH_ORDINAMENTO-1;A++) { for(int B=A+1;B<LENGTH_ORDINAMENTO;B++) { // strcmp ritorna un valore positivo se la prima è maggiore della seconda if(strcmp(Ordinare[A].Cognome,Ordinare[B].Cognome) > 0) { AppSottofile = Ordinare[A]; Ordinare[A] = Ordinare[B]; Ordinare[B] = AppSottofile; } } } /* Scrivo il vettore ordinaro nel sottofile */ for(K=0;K<LENGTH_ORDINAMENTO;K++) { fwrite(&Ordinare[K],sizeof(Record),1,App); Gotoxy(q,y+10); cout << "CREATI " << Sottoarchivi << " SOTTOARCHIVI"; } } } fclose(Archivio); fclose(App); I++; NomeFisicoApp[5]++; } } /* QUI POI CI DOVREBBE ESSERE FUSIONE */
Il primo sottofile lo crea bene e lo ordina bene, i restanti "n" no.
Se non inizia a creare bene i sottofile non posso proprio cimentarmi nella fusione.
Grazie a chiunque mi aiuterà ed anche a chi ha solo letto la mia richiesta.
Spero in un vostro aiuto.
Stefano Santomartino
aaa