Findfirst findnext et lecture écriture de fichiers..

Résolu
sebcbien_bzh Messages postés 16 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 19 juin 2015 - 21 avril 2007 à 08:31
sebcbien_bzh Messages postés 16 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 19 juin 2015 - 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

3 réponses

sebcbien_bzh Messages postés 16 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 19 juin 2015
21 avril 2007 à 09:18
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
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
22 avril 2007 à 08:57
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/
0
sebcbien_bzh Messages postés 16 Date d'inscription lundi 22 septembre 2003 Statut Membre Dernière intervention 19 juin 2015
22 avril 2007 à 09:00
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
0
Rejoignez-nous