Re: Fichier a Acces Direct (Ramdom Access File)
Publié : lun. 14/nov./2011 17:50
Merci pour le code Gebonet, juste une maj, le nombre d'enregistrement est codé sur 4 octets, donc tu peux utiliser un ReadLong pour la var "NE", plus pratique, la petite modif dans ton code :

Les structures des fichiers DBase : http://ulisse.elettra.trieste.it/servic ... struct.htm
Code : Tout sélectionner
; -------------------------------
; Decodage de fichiers DBF !!!
; -------------------------------
;{- Attribution du répertoire Rep$ -
Global Rep$ ; Localisation de l'application
Rep$= GetPathPart(ProgramFilename()) ; Le programme actuel se trouve ICI
SetCurrentDirectory(Rep$) ; On fixe le répertoire
;}
;
Enumeration
#B1
EndEnumeration
#Debut_Descripteur=32 ; Taille Secteur 0
Structure BufferDBS
N1.c ;0
AA.c ;1
MM.c ;2
JJ.c ;3
NE.l ;4
;NE2.w ;6
LG.w ;8
LG2.w ;10
EndStructure
;
; Tableau pour paramètres... Simplement a redimensionner si utile !
Dim EG$(200)
Dim EN$(200)
Dim EN1$(200)
Dim TP$(200)
Dim PR(200)
Dim NC(320)
;
MOPA$=Chr(0)+Chr(73)
;
LonBuf=SizeOf(BufferDBS):
NOMFICH$="CodesPostaux" ; Nom du fichier avec Extension DBF...
OpenFile(#B1,NOMFICH$+".DBF") ;
FileSeek(#B1,0) ; Positionne en debut de fichier
; ; ---------------------------------------
N1 =ReadAsciiCharacter(#B1) ; NOMBRE 1
AA =ReadAsciiCharacter(#B1) ; MOIS DE MISE A JOURS
MM =ReadAsciiCharacter(#B1) ; ANNEE DE MISE A JOURS
JJ =ReadAsciiCharacter(#B1) ; JOUR DE MISE A JOURS
NE =ReadLong(#B1) ; NOMBRE D'ENREGISTREMENT
;NE2 =ReadWord(#B1) ; NOMBRE D'ENREGISTREMENT
LG =ReadWord(#B1) ; LONGUEUR DE LA DESCRIPTION
LG2 =ReadWord(#B1) ; LONGUEUR DE L'ENREGISTREMENT
; ------------------------------
Debug "-----------------------------------------------------------------------------"
; 123456789012345678901234567890123456 3 Espace par caractères ???
Debug "> PREMIER NOMBRE : "+Str(N1)
Debug "> DERNIERE DATE DE MISE A JOURS : "+Str(JJ)+"/"+Str(MM)+"/"+Str(AA)
Debug "> NOMBRE D'ENREGISTREMENT : "+Str(NE);+NE2)
Debug "> LONGUEUR DES DESCRIPTEURS : "+Str(LG)
Debug "> LONGUEUR DES ENREGISTREMENTS : "+Str(LG2)
NV1 =Int((LG-1)/32)-1
Debug "> NOMBRE DE VARIABLES : "+Str(NV1)
;
; =======================================================
; Decodage et affichage des champs et paramètres associés.
; =======================================================
;
If NE+NE2>200
ReDim EN$(NE+NE2+100)
ReDim EG$(NE+NE2+100)
EndIf
; -----------------------------------------------------
NCar =32 ; Buffer de dépard
Ndecal=0 ; Decallage à 0
For i=1 To NV1 ; Pour tout les champs on récupère les entêtes et taille des champs.
EN$=Space(NCar) ; ------------------------------------------------------------------
FileSeek(#B1,#Debut_Descripteur+Ndecal) ; Positionne le pointeur avec decallage "NCar"
ReadData(#B1, @EN$,NCar); ;
FileSeek(#B1,#Debut_Descripteur+Ndecal+11);
TP$=Chr(ReadCharacter(#B1)) ; ">> Type de donnée : "+TP$
FileSeek(#B1,#Debut_Descripteur+Ndecal+12);
PR.w=ReadWord(#B1) ; ">> Enregistrement ici : "+Str(PR)
FileSeek(#B1,#Debut_Descripteur+Ndecal+16);
NC=ReadAsciiCharacter(#B1) ; ">> Carcactère du champ : "+Str(NC)
; ;
EG$(I)=EN$:TP$(I)=TP$:PR(i)=PR:NC(i)=NC ; Création des tables de paramètres
Ndecal+NCar ; Incrémente le décallage ....
; ;
Next i
Debug "-------------------------------------------------------------------------------------"
Debug "No.. - Entete colonne * Type * Precent * Nombre caractères"
Debug "----- ------------------------ ------ ---------- -------------------------------"
For i=1 To NV1
Debug Str(i)+"- "+Left(EG$(i)+"###########################",15)+" : "+TP$(i)+" : "+Str(PR(i))+" : "+Str(NC(i))
Next i
;
Debug "-----------------------------------------------------------------------------"
Debut_Donnee=LG+1 ; Début de lecture des données du fichier
Position =NE ;
Ndecal =0
;- - - - - - - - - - - - - - - -
;- Decode et extrait les enregistrements -
;- - - - - - - - - - - - - - - -
For i=1 To NE
;
Enregistrement$=Space(LG2)
FileSeek(#B1,Debut_Donnee+Ndecal)
ReadData(#B1, @Enregistrement$,LG2):Ndecal+LG2
EN$(i)=Enregistrement$
Debug RSet(Str(i),2,"0")+" : "+Enregistrement$+" ==> "+Str(Len(Enregistrement$))
Enreg$=EN$(i):
Debug "----------------"
For j=1 To NV1
En1$(j)=Left(Enreg$,NC(j)):Enreg$=Mid(Enreg$,NC(j)+1)
If TP$(j)="D"
DAT$=Mid(En1$(j),7,2)+"/"+Mid(En1$(j),5,2)+"/"+Left(En1$(j),4):En1$(j)=DAT$
EndIf
Debug Str(Nc(j))+" :"+En1$(j)
Next j
Debug "----------------"
Next i
; -- - --
CloseFile(#B1)
; -- - --

Les structures des fichiers DBase : http://ulisse.elettra.trieste.it/servic ... struct.htm