Tester la fin de ligne

van6071 Messages postés 20 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 mars 2006 - 11 mars 2006 à 16:12
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 13 mars 2006 à 07:34
Bonjour, c'est encore moi.



Voila mon soucis:



j'ai un fichier texte comme ceci : 20060303;5;44;10;8;3;3;5



et j'ai le code suivant



AssignFile (fic,tempo);

AssignFile (tirage,'c:\program files\Euro Million\tirage.del');

reset(fic);Rewrite(tirage);

b:=0;

while not EOF(fic) do

begin

readln(fic,lig);a:=1;b:=b+1;mot[a]:='';

for i:=1 to length(lig) do

begin

if copy(lig[i],1)<>';' then

mot[a]:=mot[a]+copy(lig[i],1)

else

begin

if a=1 then euro.index:=b;

if a=1 then euro.date:=mot[1];


if a=2 then euro.n1:=StrToInt(mot[2]);


if a=3 then euro.n2:=StrToInt(mot[3]);


if a=4 then euro.n3:=StrToInt(mot[4]);


if a=5 then euro.n4:=StrToInt(mot[5]);


if a=6 then euro.n5:=StrToInt(mot[6]);


if a=7 then euro.et1:=StrToInt(mot[7]);


if a=8 then euro.et2:=StrToInt(mot[8]);

a:=a+1;mot[a]:='';

end;





end;

write(tirage,euro);

end;

CloseFile(Tirage);CloseFile(fic);



Mon problème c'est que je récupère bien les valeurs sauf la dernière.
En clair je récupère 20060303, 5, 44, 10, 8, 3, 3, (j'ai mis des
virgules pour que se soit plus lisible) mais pas le 5 car je dois
avoir le controle fin de ligne qui m'emm..... enfin je pense !!

Comment je peut savoir lorsque je suis sur le fin de ligne ou si j'ai un autre problème ?

10 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 mars 2006 à 16:45
salut apparament cela doit venir du copy, (qui dans ce que tu donnes ne se compile pas --> erreur de recopie??)

comme tu ne copies qu'un seul caractère utilise plutot l'adressage
direct de la chaine: if copy(lig[i],1)<>';'
then

mot[a]:=mot[a]+copy(lig[i],1)--->

if lig[i]<>';' then

mot[a]:=mot[a]+lig[i];



@+

jlen
0
van6071 Messages postés 20 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 mars 2006
11 mars 2006 à 17:05
Merci, chez moi ça compile sans problème (je n'ai pas passé tout le code : trop long c'est pour ça que tu ne peux pas compiler). J'ai essayé ta méthode mais ça ne change rien. Merci d'avoir essayé
A+
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 mars 2006 à 17:16
pour la compilation c'est copy qui renvoie un message d'erreur --> pas assez de parametes originaux



as -tu surchargé la fonction?

voilà ce que j'ai testé et qui fonctionne

procedure TForm1.Button1Click(Sender: TObject);

var lig:string;

i: integer;

begin

lig:= '20060303;5;44;10;8;3;3;5' ;edit1.Text:='';

for i: =1 to length(lig) do

if lig[i]<>';' then

edit1.Text:=edit1.Text+lig[i];



end;

si tu fait le test tu verras que tout est correctement copié;



@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 mars 2006 à 17:22
pour mieux visualiser fais comme ça:

procedure TForm1.Button1Click(Sender: TObject);

var lig:string;

i: integer;

begin

lig:='20060303;5;44;10;8;3;3;5' ;edit1.Text:='';

for i:=1 to length(lig) do

if lig[i]<>';' then

edit1.Text:=edit1.Text+lig[i]

else edit1.Text:=edit1.Text+ '__'



end;





@+

jlen
0

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

Posez votre question
van6071 Messages postés 20 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 mars 2006
11 mars 2006 à 17:31
En fait je crois que mon problème est plus simple. Tel que ma boucle est ecrite je ne "déclanche" pas le dernier else puisque je n'ai plus de ; après le dernier caractère !!!
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 mars 2006 à 17:40
je ne crois pas puisque dans la boucle que j'ai fait cela fonctionne cela viendrait plutot de ta fonction copy



@+

jlen
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 mars 2006 à 17:45
la fonction copy tel que tu l'écris ne se compile pas

voici ce que dit l'aide

function Copy(S; Index, Count: Integer): string;



Description



S est une expression de type chaîne ou tableau dynamique. Index et
Count sont des expressions de type entier. Copy renvoie une sous-chaîne
ou un sous-tableau contenant Count caractères ou éléments en partant de
S[Index]. La sous-chaîne ou le sous-tableau est une copie unique
(c'est-à-dire qu'il/elle ne partage pas de mémoire avec S ; même
si les éléments du tableau sont des pointeurs ou des objets, ils ne
sont pas copiés non plus).



Si Index est plus grand que la taille de S, Copy renvoie une chaîne ou un tableau vide.



Si Count indique plus de caractères ou d'éléments de tableau que le
nombre disponible, seuls les caractères ou les éléments compris entre
S[Index] et la fin de S sont renvoyés.





comme tu le vois il faut 3 paramètres et ici copy(lig[i],1) tu n'en transmets que 2 donc si tu as réecrit cette fonction vérifie qu'elle fonctionne



@+

jlen
0
van6071 Messages postés 20 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 15 mars 2006
11 mars 2006 à 17:48
Merci j'ai résolu mon problème. Pour info je vous donne le code qui marche.



while not EOF(fic) do

begin

readln(fic,lig);a:=1;b:=b+1;mot[a]:='';

essai.text:=lig;

for i:=1 to length(lig) do

begin

if lig[i]<>';' then mot[a]:=mot[a]+lig[i]



else

begin

if a=1 then euro.index:=b;

if a=1 then euro.date:=mot[1];


if a=2 then euro.n1:=StrToInt(mot[2]);


if a=3 then euro.n2:=StrToInt(mot[3]);


if a=4 then euro.n3:=StrToInt(mot[4]);


if a=5 then euro.n4:=StrToInt(mot[5]);


if a=6 then euro.n5:=StrToInt(mot[6]);


if a=7 then euro.et1:=StrToInt(mot[7]);


if a=8 then euro.et2:=StrToInt(mot[8]);

a:=a+1;mot[a]:='';

end;

if a=8 then

begin

mot[8]:=lig[i+1];euro.et2:=StrToInt(mot[8]);

a:=0;

end;



end;

write(tirage,euro);

end;



Encore merci

A+
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 mars 2006 à 07:12
je me suis poser la question des performances ...

c'est simple,

pour 10 000 entrées, write < 16 ms ... read <32ms
et le poid du fichier = 157Ko contre 310Ko en texte ...

pour 100 000 entrées, write < 125 ms ... read < 312 ms
et le poid du fichier = 1 563Mo contre 3 098Mo en texte ...

c'est tellements rapide que ça m'etonne moi meme!

et ouai ... avant je faisait du code pourris, mes programmes etait lourdingue est sans interets ...
depuis que florenth, kenavo, grandvizir, delphiprog, cirec, jlen et les autres sont entrés dans ma vie ...
je fais des routines optimisées, rapides, legeres comme l'air ...
merci delphifr d'avoir fait de moi un bon...

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
13 mars 2006 à 07:34
aller, c'est l'heure des calculs,

vus qu'on mets 10*T de temps pour 10*N entrées et que le poids du fichier est egalement de 10*P pour 10*N

pour 1M entrées : w<1.2sec, r<3.1sec, p<10.5Mo
pour 100M entrées : w<11s, r<30s, p<1Go
pour 1G entrées : w<1m35s, r<2m30s, p<10Go

(données purrement theorique car faut pas imaginer la tete du tableau dynamique avec 1Giga d'entrées ... )

l'interet quand meme, d'ecrire directement les données dans leur type et non en texte est que :

en texte :
date = 10 octets
numeros de 0 a 9 = 1 octet * 7
numeros de 10 a 99 = 2 octets * 7
sept point virgule = 7 octets
un eoln = 2 octets
soit 26 octets minimum et 35 octets maximum



en "binaire"
date = 8 octets
numeros de 0 a 99 = 1 octet * 7
une fin de donnée = 1 octet (h00)
soit 16 octets fixe...
soit un gain de 10 a 19 octets sur le fichier texte, ce qui n'est tout de meme pas negligeable, sans compter la facilitée pour lire et ecrire les données.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0
Rejoignez-nous