Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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.


"I have never let my schooling interfere with my education." Mark Twain
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