Lecture Fichier

Résolu
ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005 - 22 avril 2005 à 15:09
ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005 - 26 avril 2005 à 09:12
Bonjour tout le monde,

Voilà je suis en stage au CETE de l'est et j'ai pour mission de convertir un programme assez ancien écrit en TurboPascal en Delphi(version7). Je prépare un DUT GEII.Ce programme fonctionne actuellement mais pas sur Xp et est trés limité en fléxibilité et ergonomie. Pour préciser je n'ai jamais utiliser TurboPascal ni Delphi. J'ai appris pas mal de choses sur le tas et j'ai un problème en ce qui concerne la lecture d'un fichier.

En effet il y a un appareil de mesure de vibrations sismiques qui relève les enregistrements sur un fichier avec l'extension .sg2. Or ce fichier est inutilisable sauf à part passer par un programme car on ne peut pas l'ouvrir, même si on arrive en text on comprend rien.
Donc il faut que je convertisse ce fichier avec les valeurs comprises dedans en un fichier text.

J'ai fait environ 20 % du programme en delphi mais à un moment il y a un problème. Pour rappeler j 'ai les codes sources du programme écrit en TurboPascal qui m'aident beaucoup.
au début je me suis beaucoup inspiré du programme initiale tant que mon nouveau programme fonctionne.

Ma question auquel je voudrais une réponse si possible: ->j'assigne mon fichier que je veux convertir à un File. Ensuite je fais un Reset soit : Reset(fichier,2) mais avec un 2?. Ensuite je fais une lecture blockread(fichier,recup,4,nc). Puis je recupere une valeur nbtrace:=recup[4] et là j'obtiens n'importe quoi. Dans le programme initiale on a nbtrace= 9 et ici nbtrace= 1510184. Ainsi je ne sais pas comment lire correctement le fichier pour obtenir la bonne valeur car je pense que les instructions entre le TurboPascal et le Delphi sont quelques peu différentes. Pourtant j'ai initialisé recup et nbtrace mais rien ne change.

Pour conclure je demande à ceux qui sachent de bien vouloir m'aider ou bien de me donner des conseils car depuis 3 jours je suis bloqué. Merci de votre attention.

7 réponses

ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005
26 avril 2005 à 09:12
rebonjour j'ai trouvé le probléme, cela provient du blockread.En effet on ne peut pas mettre la valeur lue avec un blockread dans un integer mais plutot dans un word.Ainsi ca marche mieux.Encore merci pour vos conseils.
3
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
22 avril 2005 à 20:13
De quel type est Recup ? Un Array ? Quelle taille ?



Quad tu fais Reset(Fichier,2) , cela veux dire que tu vas lire le fichier 2 octets par 2 octets. Ensuite quand tu fais blockread(fichier,recup,4,nc)tu
copies 4 "données" dans recup et nc te renseigne sur le nombre réel de
"données" copiées. Tes "données" sont des "choses" (des
enregistrements) de 2 octets (le 2 de reset). Si tu veux lire Recup[4]
et qu'il soit significatif, il faut que recup soit du type Array[1..x] of word, s'il est du type Array[0..x] of word, Recup[4] n'est pas "rempli" (les 4 z'enregistrements sont rangés dans recup[0], recup[1] recup[2] et recup[3]). Le fait que tu arrives à lire 1510184 m'étonne : un word (2 octets ne peut dépasser 65536).



Autre chose : ne recopie pas un
type Record qui défini un enregistrement fichier sans le transformer en
Packed Record. Les alignements de données utilisés depuis le 16 bits
(Bon anniversaire Delphi 1) modifient la réalité de ces type Record
(leur empreinte mémoire).



J'espère avoir n'avoir pas été trop confus dans mes propos et que tu y trouveras une piste.



Bon courage (moi je pars en vacances)



Ken@vo


<hr size="2" width="100%">
Code, Code, Codec !

http://www.pourflorenceethussein.org/
0
vincentstryckmans Messages postés 228 Date d'inscription lundi 5 avril 2004 Statut Membre Dernière intervention 25 octobre 2006
22 avril 2005 à 21:47
Deux, trois rermarques comme cela en passant .



<li>Connais tu le format du fichier .sg2 ?</li>
<li>Si tu télécharges ce bon viuex
Turbo Pascal 5.5 (gratuit chez Borland), tu peux peut-être ouvrir ce
foutu fichier et le réécrire en un format pur texte que tu seras relire
avec Delphi.</li>

Oui, je sais, je raconte peut-être des conneries, mais il est 22h00 et je n'ai plus dormi depuis 01h00.



Call me back pour que le forum t'aide un peu plus



Et comme disait ma grand-mère : il y a toujours du soleil derrière les nuages.

Vincent Stryckmans.
0
ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005
25 avril 2005 à 08:39
Bonjour merci d'avoir repondu,

En effet recup est un array[1..4] of integer et j'obtiens toujours des valeurs tres superieurs.
J'ai relevé les valeurs de recup at j'ai:
recup[1]=80469
recup[2]=393240
recup[3]=4536909
recup[4]=4526917 ici il n y a que recup 3 et 4 qui m'interesse. Tout ce que je peux dire est que je dois obtenir normalement la valeur 9 en recup[4].
De plus j'a essayé de l'ouvrir avec TB 5.5 et j'ai remarqué que l'enregistrement est sur une ligne ce qui veux donc dire qu'il faut que je me 'promene' sur la ligne pour trouver les bonnes infos.

Pour ceux qui intéresse voici la procedure du prog initiale permettant de lire des donnees:

PROCEDURE LIRE_BLOC_FICHIER(numfi: integer; repert: string;
var nomfi:string;
var existPas: boolean);


var
i, k, nc, decal,dep: integer;
recup :array[1..4]of integer;
tabc:array[1..60] of char;
Begin
nomfi:=nom_fichier(numfi);
if fich_existe(nomfi) then
begin
assign(fich,nomfi);
reset(fich,2); {lecture par 2 octets}
blockread(fich,recup,4,nc);
lgblocPT := recup[3]; {longueur du sous-bloc pointeur de trace}
nbtrace := recup[4];
nbCap := nbtrace div 3;
reset(fich,1); {lecture par 1 octets}
seek(fich,32);
for i := 1 to nbtrace do {lecture des pointeurs de blocs traces}
blockread(fich,Pt_Tr[i],4,nc);



{ lecture des commentaires du bloc fichier}
reset(fich,1);
decal:= 32+lgblocPT;
seek(fich,decal);
(*writeln('decal: ',decal);*)
blockread(fich,dep,2,nc);


repeat
for k:=1 to 60 do tabc[k]:=chr(0);
for i:= 1 to dep-2 do blockread(fich,tabc[i],1,nc);


ligne:=tabc;
Traduire_Code_Fichier(ligne,dep);
decal:=decal+dep;
seek(fich,decal);
blockread(fich,dep,2,nc);
until dep=0;
end
else existPas := true;


End; {lire bloc_fichier}

Comme vous pouvez le voir je suis bloqué dés le début.Ainsi pour ceux qui aurait une idée il serait sympa de m'aider.Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005
25 avril 2005 à 08:39
Bonjour merci d'avoir repondu,

En effet recup est un array[1..4] of integer et j'obtiens toujours des valeurs tres superieurs.
J'ai relevé les valeurs de recup at j'ai:
recup[1]=80469
recup[2]=393240
recup[3]=4536909
recup[4]=4526917 ici il n y a que recup 3 et 4 qui m'interesse. Tout ce que je peux dire est que je dois obtenir normalement la valeur 9 en recup[4].
De plus j'a essayé de l'ouvrir avec TB 5.5 et j'ai remarqué que l'enregistrement est sur une ligne ce qui veux donc dire qu'il faut que je me 'promene' sur la ligne pour trouver les bonnes infos.

Pour ceux qui intéresse voici la procedure du prog initiale permettant de lire des donnees:

PROCEDURE LIRE_BLOC_FICHIER(numfi: integer; repert: string;
var nomfi:string;
var existPas: boolean);


var
i, k, nc, decal,dep: integer;
recup :array[1..4]of integer;
tabc:array[1..60] of char;
Begin
nomfi:=nom_fichier(numfi);
if fich_existe(nomfi) then
begin
assign(fich,nomfi);
reset(fich,2); {lecture par 2 octets}
blockread(fich,recup,4,nc);
lgblocPT := recup[3]; {longueur du sous-bloc pointeur de trace}
nbtrace := recup[4];
nbCap := nbtrace div 3;
reset(fich,1); {lecture par 1 octets}
seek(fich,32);
for i := 1 to nbtrace do {lecture des pointeurs de blocs traces}
blockread(fich,Pt_Tr[i],4,nc);



{ lecture des commentaires du bloc fichier}
reset(fich,1);
decal:= 32+lgblocPT;
seek(fich,decal);
(*writeln('decal: ',decal);*)
blockread(fich,dep,2,nc);


repeat
for k:=1 to 60 do tabc[k]:=chr(0);
for i:= 1 to dep-2 do blockread(fich,tabc[i],1,nc);


ligne:=tabc;
Traduire_Code_Fichier(ligne,dep);
decal:=decal+dep;
seek(fich,decal);
blockread(fich,dep,2,nc);
until dep=0;
end
else existPas := true;


End; {lire bloc_fichier}

Comme vous pouvez le voir je suis bloqué dés le début.Ainsi pour ceux qui aurait une idée il serait sympa de m'aider.Merci
0
ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005
25 avril 2005 à 08:39
Bonjour merci d'avoir repondu,

En effet recup est un array[1..4] of integer et j'obtiens toujours des valeurs tres superieurs.
J'ai relevé les valeurs de recup at j'ai:
recup[1]=80469
recup[2]=393240
recup[3]=4536909
recup[4]=4526917 ici il n y a que recup 3 et 4 qui m'interesse. Tout ce que je peux dire est que je dois obtenir normalement la valeur 9 en recup[4].
De plus j'a essayé de l'ouvrir avec TB 5.5 et j'ai remarqué que l'enregistrement est sur une ligne ce qui veux donc dire qu'il faut que je me 'promene' sur la ligne pour trouver les bonnes infos.

Pour ceux qui intéresse voici la procedure du prog initiale permettant de lire des donnees:

PROCEDURE LIRE_BLOC_FICHIER(numfi: integer; repert: string;
var nomfi:string;
var existPas: boolean);


var
i, k, nc, decal,dep: integer;
recup :array[1..4]of integer;
tabc:array[1..60] of char;
Begin
nomfi:=nom_fichier(numfi);
if fich_existe(nomfi) then
begin
assign(fich,nomfi);
reset(fich,2); {lecture par 2 octets}
blockread(fich,recup,4,nc);
lgblocPT := recup[3]; {longueur du sous-bloc pointeur de trace}
nbtrace := recup[4];
nbCap := nbtrace div 3;
reset(fich,1); {lecture par 1 octets}
seek(fich,32);
for i := 1 to nbtrace do {lecture des pointeurs de blocs traces}
blockread(fich,Pt_Tr[i],4,nc);



{ lecture des commentaires du bloc fichier}
reset(fich,1);
decal:= 32+lgblocPT;
seek(fich,decal);
(*writeln('decal: ',decal);*)
blockread(fich,dep,2,nc);


repeat
for k:=1 to 60 do tabc[k]:=chr(0);
for i:= 1 to dep-2 do blockread(fich,tabc[i],1,nc);


ligne:=tabc;
Traduire_Code_Fichier(ligne,dep);
decal:=decal+dep;
seek(fich,decal);
blockread(fich,dep,2,nc);
until dep=0;
end
else existPas := true;


End; {lire bloc_fichier}

Comme vous pouvez le voir je suis bloqué dés le début.Ainsi pour ceux qui aurait une idée il serait sympa de m'aider.Merci
0
ertu7 Messages postés 13 Date d'inscription mardi 26 octobre 2004 Statut Membre Dernière intervention 28 avril 2005
25 avril 2005 à 08:41
Désolé j'ai cliqué plusieurs fois comment faiton pour editer un message ou le supprimer?Merci
0
Rejoignez-nous