Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinamento esterno su file binario
Forum - C/C++ - Ordinamento esterno su file binario

Avatar
stefanopeppy (Normal User)
Newbie


Messaggi: 9
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 1:52
Giovedì, 03/06/2010
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:

Codice sorgente - presumibilmente C#

  1. void Ordinamento(FILE* Archivio, T_Nominativo Record)
  2. {
  3.     // Vettore Da ordinare = contiene "LENGTH_ORDINAMENTO" record presi dall'archivio
  4.     T_Nominativo Ordinare[LENGTH_ORDINAMENTO];
  5.     T_Nominativo AppSottofile;
  6.    
  7.     int Nrec = NumeroRecord(Archivio, Record);
  8.     int Sottoarchivi = (Nrec)/(LENGTH_ORDINAMENTO);
  9.  
  10.     // Sottoarchivio aggiuntivo nel caso in cui il resto tra Nrec/LENGTH_ORDINAMENTO sia maggiore di 0
  11.     if((Nrec%LENGTH_ORDINAMENTO)>0) Sottoarchivi++;
  12.    
  13.     int I=0; // Indice Crea Sottoarchivi
  14.     int J=0; // Indice copia nel vettore
  15.     int K=0; // Indice Scrittura Sottoarchivi
  16.     bool copiato = 0; // E' Stato copiato?
  17.     int IndicePosizioneLetturaSottofile = 0; // fseek
  18.     int RecordCopiati = 0; // Quanti ne copia
  19.  
  20.     char NomeFisicoApp[9];
  21.     NomeFisicoApp[0] = 'T';
  22.     NomeFisicoApp[1] = 'E';
  23.     NomeFisicoApp[2] = 'M';
  24.     NomeFisicoApp[3] = 'P';
  25.     NomeFisicoApp[4] = '_';  
  26.     NomeFisicoApp[5] = 'A';
  27.     NomeFisicoApp[6] = '.';
  28.     NomeFisicoApp[7] = 'd';
  29.     NomeFisicoApp[8] = 'a';
  30.     NomeFisicoApp[9] = 't';
  31.    
  32.  
  33.     while(I<Sottoarchivi)
  34.     {
  35.         FILE* App;
  36.         App = fopen(NomeFisicoApp,"w+");
  37.         Archivio = fopen(FILE_NAME,"r+");
  38.         if(!Archivio)
  39.         {
  40.             Gotoxy(q,y+10);
  41.             cout << "ERRORE ARCHIVIO PRINCIPALE";
  42.         }else if(!App)
  43.         {
  44.             Gotoxy(q,y+10);
  45.             cout << "ERRORE FILE D'APPOGGIO";
  46.         }else
  47.         {    
  48.          /* Prelevo Record da "Archivio" */    
  49.          J=0;
  50.          copiato = 0;
  51.             while(J<LENGTH_ORDINAMENTO)
  52.             {
  53.                 /* Copio nel vettore */
  54.                 fseek(Archivio,sizeof(Record)*IndicePosizioneLetturaSottofile,0);
  55.                 /* Ad ogni record letto passa a quello successivo, lo farebbe normalmente
  56.                    la funzione fread però nel ciclo la posizione viene cambiata e quindi
  57.                    ne tengo conto qui*/
  58.                 fread(&Record,sizeof(Record),1,Archivio);
  59.                 Ordinare[J] = Record;
  60.                 // Mette correttamente i record nel vettore
  61.                 J++;                
  62.                 copiato = 1;
  63.                 IndicePosizioneLetturaSottofile++;
  64.             }
  65.            
  66.             /* Se il vettore è stato riempito */
  67.             if(copiato==1){
  68.                 /* Ordino il vettore */
  69.                 for(int A=0;A<LENGTH_ORDINAMENTO-1;A++)
  70.                 {
  71.                     for(int B=A+1;B<LENGTH_ORDINAMENTO;B++)
  72.                     {
  73.                         // strcmp ritorna un valore positivo se la prima è maggiore della seconda
  74.                         if(strcmp(Ordinare[A].Cognome,Ordinare[B].Cognome) > 0)                        
  75.                         {
  76.                             AppSottofile = Ordinare[A];
  77.                             Ordinare[A] = Ordinare[B];
  78.                             Ordinare[B] = AppSottofile;
  79.                         }
  80.                     }
  81.                 }
  82.                 /* Scrivo il vettore ordinaro nel sottofile */
  83.                 for(K=0;K<LENGTH_ORDINAMENTO;K++)
  84.                 {
  85.                     fwrite(&Ordinare[K],sizeof(Record),1,App);
  86.                     Gotoxy(q,y+10);
  87.                     cout << "CREATI " << Sottoarchivi << " SOTTOARCHIVI";                                  
  88.                 }
  89.             }
  90.            
  91.        
  92.         }
  93.         fclose(Archivio);
  94.         fclose(App);
  95.         I++;
  96.         NomeFisicoApp[5]++;
  97.     }
  98. }
  99. /* 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;)

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 1:28
Sabato, 05/06/2010
Puoi allegare la dichiarazione di T_Nominativo?
Se posti l'intero programma diventa più facile fare un po' di debug.

PM Quote
Avatar
stefanopeppy (Normal User)
Newbie


Messaggi: 9
Iscritto: 24/02/2009

Segnala al moderatore
Postato alle 11:06
Lunedì, 07/06/2010
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 il 07/06/2010 alle 11:09
PM Quote