Oppure

Loading
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:


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
04/06/10 23:28
Matthew
Puoi allegare la dichiarazione di T_Nominativo?
Se posti l'intero programma diventa più facile fare un po' di debug.
aaa
07/06/10 9:06
stefanopeppy
Ti allego il mio sorgente. In questi giorni comunque mi sono accorto che il programma funziona bene, anzi l'ho anche migliorato.
I sottofile vengono creati ed ordinati benissimo.
Adesso mi servirebbe unirli con la fusione.
Credimi sto da una settimana, ma non riesco proprio a fonderli.
Spero in tuo aiuto.
Ti ringrazio.

Stefano

Edit: "non riesco ad allegare il mio sorgente, postarlo per intero qui non mi sembra il caso, sono quasi 1000 righe"
Ultima modifica effettuata da stefanopeppy 07/06/10 9:09
aaa