Findfirst findnext et lecture écriture de fichiers.. [Résolu]

sebcbien_bzh 16 Messages postés lundi 22 septembre 2003Date d'inscription 19 juin 2015 Dernière intervention - 21 avril 2007 à 08:31 - Dernière réponse : sebcbien_bzh 16 Messages postés lundi 22 septembre 2003Date d'inscription 19 juin 2015 Dernière intervention
- 22 avril 2007 à 09:00
bonjour,

pour l'instant j'ai une simple application avec un bouton (delphi 7) .
L'application recherche des .csv dans le dossier où se trouve le .exe (je ne me suis pas encore penché sur le répertoire externe). il lit le .csv fait des tests sur les données a sauvegarder puis les sauvegarde dans un anomalie+date+.tempo.
J'ai testé sans findfirst  findnext : ca marche bien la lecture ecriture...
dès que je mets les findfirst findnext et findclose... ca marche pour le premier fichier puis ensuite eaccessviolation. gloups...
J'ai viré pour tester : la partie réécriture dans un autre fichier... meme probleme, j'ai viré la partie en apres Readln(F,lect); jusqu'à la ligne précédent until eof(f) et la ca marche , du moins pas de plantage...
mais alors d'où vient le problème... car la partie enlevée marche pour lepremier fichier...
procedure TForm1.Button1Click(Sender: TObject);
Var F,G: TextFile;
    sr:TSearchRec;
    lect : ansistring;
    donnees1 : array [0..21] of shortstring;
    donnees2 : array [0..9] of shortstring;
    x,y : integer;
    temp,temp2 : string;
begin
//http://pascal.developpez.com/cours/artdynarr/
FindFirst('*.csv',faAnyFile,sr);
repeat
AssignFile(F,sr.name); //Associe la variable F au fichier texte
{$I-} //La vérification d'E/S est désactivée
Reset(F);
{$I+} //La vérification d'E/S est activée
if IoResult=0 then //Renvoie l'état de la dernière opération d'E/S
      repeat //Repeter...
              Readln(F,lect); //Lit une ligne du fichier texte jusqu'au prochain sut de ligne
              y:=0;
              //donnees1[0]:='';
              //initialize (donnees1);
              for x:=0 to 21 do donnees1[x]:='';  //initialise le tableau
              for x:=1 to length (lect) do
              begin
                  temp:=copy (lect,x,1);          // stock les données dans une tableau en virant les ;
                  if temp<>';' then
                     donnees1[y]:=donnees1[y]+temp
                     else
                     begin
                     inc(y);
                     donnees1[y]:='';
                     end;
              end;
              temp:= donnees1[1];
              if (donnees1[3]<>'') and (temp[1]in['0'..'9'] ) then        //vérifie si la donnée est a garder
                  begin
                      for x:=0 to 9 do donnees2[x]:='';  //initialise le tableau
                      donnees2[0]:=donnees1[1];
                      donnees2[1]:=donnees1[14];
                      donnees2[2]:=donnees1[2];
                      donnees2[3]:=donnees1[3];
                      donnees2[4]:=donnees1[4];
                      donnees2[5]:=donnees1[5];
                      donnees2[6]:=donnees1[6];
                      donnees2[7]:=donnees1[8];
                      donnees2[8]:=donnees1[17];
                      donnees2[9]:=donnees1[18];
                      temp2:='anomalie-'+copy(donnees2[0],1,2)+'-'+copy(donnees2[0],4,2)+'-'+copy(donnees2[0],7,4)+'.tempo';
                      AssignFile(G,temp2); //Associe la variable F au fichier texte
                      {$I-} //La vérification d'E/S est désactivée
                      append(G);
                      {$I+} //La vérification d'E/S est activée
                      if IoResult=0 then //Renvoie l'état de la dernière opération d'E/S
                          begin    //si le fichier existe
                          writeln(G,donnees2[0]+';'+donnees2[1]+';'+donnees2[2]+';'+donnees2[3]+';'+donnees2[4]+';'+donnees2[5]+';'+donnees2[6]+';'+donnees2[7]+';'+donnees2[8]+';'+donnees2[9]);
                          end
                          else
                          begin
                          Rewrite(G); // fichier n'existe pas
                          writeln(G,donnees2[0]+';'+donnees2[1]+';'+donnees2[2]+';'+donnees2[3]+';'+donnees2[4]+';'+donnees2[5]+';'+donnees2[6]+';'+donnees2[7]+';'+donnees2[8]+';'+donnees2[9]);
                          end;
                      closefile(G);   //Ferme l'association entre la variable G et le fichier texte
                  end;
     until EOF(F);// ...jusqu'à ce que la position en cours du pointeur se trouve en fin de fichier
CloseFile(F); //Ferme l'association entre la variable F et le fichier texte
until FindNext(sr)<>0;
FindClose(sr);
end;


Merci pour votre aide.





<hr />
vous pouvez visiter mon site : http://www.sebcbien.com
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
sebcbien_bzh 16 Messages postés lundi 22 septembre 2003Date d'inscription 19 juin 2015 Dernière intervention - 21 avril 2007 à 09:18
3
Merci
problème résolu, ca venait de la :
donnees1[y]:='';
en effet je réinitialisais un tableau en dehors du tableau...
cela finissait par planter surment que cela empietait sur une variable nécessaire a findnext.

<hr />
vous pouvez visiter mon site : http://www.sebcbien.com

Merci sebcbien_bzh 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de sebcbien_bzh
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 22 avril 2007 à 08:57
0
Merci
Si je peux me permettre de te donner un conseil, dans ton cas, évite d'employer un bloc repeat..until sans tester la valeur de retour de FindFirst car il sera exécuté au moins une fois même si FindFirst n'a rien trouvé.
A la place, il est préférable de faire ceci :
if FindFirst('*.csv', faAnyFile, sr) =  0 then
repeat
...
until FindNext(sr) <> 0;
FindClose(sr);

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Commenter la réponse de cs_Delphiprog
sebcbien_bzh 16 Messages postés lundi 22 septembre 2003Date d'inscription 19 juin 2015 Dernière intervention - 22 avril 2007 à 09:00
0
Merci
merci du conseil je l'applique de suite ca fais parti des amélioration que je devais faire par la suite.

<hr />
vous pouvez visiter mon site : http://www.sebcbien.com
Commenter la réponse de sebcbien_bzh

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.