Corrigé 40  Enoncé

Une structure simple de fichiers avec récupération dynamique des fragments.


Soient F un Fichier de vecteur ( 1024 ) de caractères avec un entête à trois champs ( Entier , Entier , Entier ) qui désigne respectivement le dernier bloc, le nombre de trous et le nombre d'articles et qui représentent donc les caractéristiques du fichier. Buf1 désigne le buffer associé à F

Soit Table_trous un vecteur ( 100 ) de ( Entier , Entier , Entier ) désignant respectivement le numéro du bloc, le déplacement et la longueur.

Création

    Ouvrir ( F , 'f.pas' , 'N' )
    Aff_entete ( F , 1 , 0 )
    Aff_entete ( F , 2 , 0 )
    Aff_entete ( F , 3 , 0 )
    Fermer ( F )

Insertion

    Cle := Caract ( Art , 1 ) + Caract ( Art , 2 ) +
    Caract ( Art , 3 ) + Caract ( Art , 4 )
    Long := Longchaine ( Art )
    SI ( Entete ( F , 3 ) = 0 )
        { première insertion }
        Copier ( C ( Long ) + Art , Long + 3 , 1 )
        Aff_entete ( F , 3 , Entete ( F , 3 ) + 1 )
        Rajouter ( F , Buf1 )

        SI Taille - ( Long + 3 ) > 0
            Inserer_trou ( 1 , Long + 3 + 1 , Taille - ( Long + 3 ) )
            Aff_entete ( F , 2 , Entete ( F , 2 ) + 1 )
        FSI
        Aff_entete ( F , 1 , Entete ( F , 1 ) + 1 )

    SINON
        Rechercher ( Cle , Trouv , Adr , Depl , L )
        SI NON Trouv
            Rechercher_trou ( Long + 3 , Trouv , A , B , L )
            SI Trouv
                Liredir ( F , Buf1 , A )
                Copier ( C ( Long ) + Art , Long + 3 , B )
                Aff_entete ( F , 3 , Entete ( F , 3 ) + 1 )
                Ecriredir ( F , Buf1 , A )
                Supprimer_trou ( A , B )
                Aff_entete ( F , 2 , Entete ( F , 2 ) - 1 )
                SI L - ( Long + 3 ) > 0
                    Inserer_trou ( A , B + Long + 3 , L - ( Long + 3 ) )
                    Aff_entete ( F , 2 , Entete ( F , 2 ) + 1 )
                FSI
            SINON
                Copier ( C ( Long ) + Art , Long + 3 , 1 )
                Aff_entete ( F , 3 , Entete ( F , 3 ) + 1 )
                Rajouter ( F , Buf1 )
                SI Taille - ( Long + 3 ) > 0
                    Inserer_trou ( Entete ( F , 1 ) + 1 , Long + 3 + 1 ,
                    Taille - ( Long + 3 ) )
                    Aff_entete ( F , 2 , Entete ( F , 2 ) + 1 )
                FSI
                Aff_entete ( F , 1 , Entete ( F , 1 ) + 1 )
            FSI
        SINON
            Ecrire ( 'cle existe ' )
        FSI
    FSI


Recherche

Rechercher ( Cledonnee , Trouv1 , Adr , Depl , Lg )

    Ouvrir ( F , 'f.pas' , 'A' )
    Deb := 1
    Adr := 1
    Trouv1 := FAUX
    TANTQUE NON FINfich ( F ) Et ( NON Trouv1 )
        Liredir ( F , Buf1 , Adr )
        TANTQUE ( Deb <= Taille ) Et NON Trouv1
            Est_ce_un_trou ( Adr , Deb , Trouv2 , L )
            SI Trouv2
                Deb := Deb + L
            SINON
                Extraire ( Deb , 3 , Chainelg )
                Lg := E ( Chainelg )
                Extraire ( Deb + 3 , 4 , Cle )
                SI Cle = Cledonnee
                    Trouv1 := VRAI
                SINON
                    Deb := Deb + Lg + 3
                FSI
            FSI
        FTANTQUE
        SI NON Trouv1
            Adr := Adr + 1
            Deb := 1
        FSI
    FTANTQUE


Réorganisation

    POUR I := 1 , ENTETE ( F , 1 )
        LIREDIR ( F , Buf1 , I )
        Pos := 1
        Continue := VRAI
        TANTQUE Continue
            Deb := 1
            TANTQUE Deb < Taille
                Est_ce_un_trou ( I , Deb , Trouv , Long )
                SI Trouv
                    Deb := Deb + Long
                    Supprimer_trou ( I , Deb )
                    AFF_ENTETE ( F , 2 , ENTETE ( F , 2 ) - 1 )
                SINON
                    Extraire ( Deb , 3 , Ch )
                    Lg := E ( Ch )
                    SI Pos # 1 :
                        Extraire ( Deb , Lg + 3 , Ch )
                        Copier ( Ch , Lg + 3 , Pos )
                    FSI
                    Deb := Deb + Lg + 3
                    Pos := Pos + Lg + 3
                FSI
            FTQ
            SI Pos > 1
                ECRIREDIR ( F , Buf1 , Adr )
                Inserer_trou ( Adr , Pos , Taille - Pos + 1 )
                AFF_ENTETE ( F , 2 , ENTETE ( F , 2 ) + 1 )
                Continue := FAUX
            SINON
                LIREDIR ( F , Buf1 , ENTETE ( F , 1 ) )
                AFF_ENTETE ( F , 1 , ENTETE ( F , 1 ) - 1 )
            FSI
        FTQ
    FPOUR

Mesures


Nombre moyen d'accès pour les opérations considérées :
Recherche : N/2
Insertion : N/2 ( Recherche) + 2 ( Lecture + écriture)
Suppression : N/2 ( Recherche)

Le but de la réorganisation est double : récupérer l'espace disque et accélérer les opérations sur fichiers.