Pb pour enumerer un repertoire

salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007 - 6 mai 2003 à 20:53
salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007 - 9 mai 2003 à 23:24
Voila, j'essaie de faire un bout de code qui me permet :

-D'enumerer les fichiers de deux repertoire different (ca ca marche),
-Et ensuite mettre le nom de ces fichiers dans 2 variables : name1 et name2 (en considerant qu'il n'y a qu'1 fichier par repertoire) pour pouvoir ensuite les manipuler (ca ca marche pas).

Mais j'ai un Pb, mes 2 variables name1 et name2 ont la meme valeur et j'ai meme des signes bizarre en sortie.

Voila mon code:(si vous pouviez m'aider je vous en serez tres reconnaissant!!!!!)

#include 
#include <windows.h>
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#include<direct.h>
#include<conio.h>

void tolist(LPCTSTR file);
void tocompare(LPCTSTR file);

char *name1=NULL;
char *name2=NULL;

void main()
{
    tolist("C:\\Shapefile\\*.*");    //1er repertoire ds lequel je cherche
    tocompare("C:\\Report\\*.*");//2eme repertoire dans lequel je cherche
    printf("\n%s",name1);
    printf("\n%s",name2);
 }

void tolist(LPCTSTR file)  //fonction d'enumeration des fichiers d'un repertoire
{
    WIN32_FIND_DATA wData;
    BOOL re;
    HANDLE listing;

    listing = FindFirstFile(file, &wData);

re=TRUE;
do 
{
    re = FindNextFile(listing, &wData);
name1=wData.cFileName;
} 
while (re); 

}  

//----------------------------------------------------------------

void tocompare(LPCTSTR file) //meme fonction d'enumeration avec juste                                    //wData2 et listing2 a la place de wData1 et listing1

{
    WIN32_FIND_DATA wData2;
    BOOL re;
    HANDLE listing2;

    listing2 = FindFirstFile(file,    &wData2);

re=TRUE;
do 
{
    re = FindNextFile(listing2, &wData2);
name2=wData2.cFileName;

} 
while (re); 
    
}  

3 réponses

cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
6 mai 2003 à 21:43
Erreur classique: tu fais pointer tes variables 'name1' et 'name2' sur une adresse mémoire locale aux fonctions 'tolist()' et 'tocompare'. Une variable locale est détruite en sortant de la fonction où elle est déclarée.

Pour résoudre ton problème, tu peux par exemple utiliser la fonction strdup():

name1=strdup(wData.cFileName);

// Utilisation de name1
// ...

// Libération
free(name1);

Kaid
0
salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007
8 mai 2003 à 20:06
Dabord trop merci pour ton aide, ca marche maintenant parfaitement, par contre j'ai prefere utiliser des strcpy mais l'erreur viens exeactement de ce que que tu m'as dis.

Je voudrais pas trop abuse a nouveau (bientot la majorite de mon programme ne sera pas de moi...)mais j'ai encore un nouveau probleme, j'y est passe 8h dessus hier et j'arrive pas a trouve.

J'ai rajoute un if qui normalement me permet de
"d'incrementer" le nom d'un fichier pour que par exemple (dans mon cas ) si j'ai:

- Dans mon premier repertoire le fichier St._Thomas1.dbf
- Dans mon second repertoire les fichiers :

report.txt
St._Thomas1.dbf
St._Thomas2.dbf
St._Thomas3.dbf

je veux que ma variable name1char soit St._Thomas4.dbf a la fin de mon programme, le probleme c'est que cela marche parfaitement pour la premiere boucle (name1char="St._Thomas2.dbf) mais ensuite ecla ne marche plus (voir plus bas).

Mon programme :
#include 
#include <windows.h>
#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#include<direct.h>
#include<conio.h>

void tolist(LPCTSTR file);
void tocompare(LPCTSTR file);

char name1[255];
char name2[255];

void main()
{
    tolist("C:\\Shapefile\\*.*");
    tocompare("C:\\Report\\*.*");
}

void tolist(LPCTSTR file)
{
    WIN32_FIND_DATA wData;
    BOOL re;
    HANDLE listing;
    listing = FindFirstFile(file, &wData);

re=TRUE;

do 
{
    re = FindNextFile(listing, &wData);
    strcpy(name1,wData.cFileName);
} 
while (re); 

}  

void tocompare(LPCTSTR file)
{
    WIN32_FIND_DATA wData2;
    int length;
   char lastchar,name1char[255]; 
    BOOL re;
    HANDLE listing2;

    listing2 = FindFirstFile(file, &wData2);

re=TRUE;

do 
{
   re = FindNextFile(listing2, &wData2);
   strcpy(name2,wData2.cFileName);
   printf("\n\nname1char avant le if : %s",name1char);
   printf("\nname2 avant le if : %s",name2);
   strcpy(name1char,name1);
  
if (strcmp(name1char,name2) == 0)
{
  length=strlen(name1char);
  lastchar=name1char[length-5];
  name1char[length-5]=lastchar+1;
  printf("\nlastchar : %c",lastchar);
      printf("\nname1char a la fin du if : %s",name1char);
}
printf("\nname1char apres le if : %s",name1char); 
} 
while (re); 
  
}  


et j'ai en resultat qd j'execute mon programme cela :

name1char avant le if : &#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#
name2 avant le if : ..
name1char apres le if : St._Thomas1.dbf

name1char avant le if : St._Thomas1.dbf
name2 avant le if : report.txt
name1char apres le if : St._Thomas1.dbf

name1char avant le if : St._Thomas1.dbf
name2 avant le if : St._Thomas1.dbf
lastchar : 1
name1char a la fin du if : St._Thomas2.dbf
name1char apres le if : St._Thomas2.dbf

name1char avant le if : St._Thomas2.dbf
name2 avant le if : St._Thomas2.dbf
name1char apres le if : St._Thomas1.dbf

name1char avant le if : St._Thomas1.dbf
name2 avant le if : St._Thomas3.dbf
name1char apres le if : St._Thomas1.dbf

name1char avant le if : St._Thomas1.dbf
name2 avant le if : St._Thomas3.dbf
name1char apres le if : St._Thomas1.dbfPress any key to continue


Si vous pouviez m'aider....merci
0
salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007
9 mai 2003 à 23:24
Ca y est g resolu mon probleme
le
 
strcpy(name1char,name1); 

devait etre sorti de la boucle.

Merci a kaid de m'avoir aider, ca m'a bien aider

-------------------------------
RsSponse au message :
-------------------------------

> Dabord trop merci pour ton aide, ca marche maintenant parfaitement, par contre j'ai prefere utiliser des strcpy mais l'erreur viens exeactement de ce que que tu m'as dis.
>
> Je voudrais pas trop abuse a nouveau (bientot la majorite de mon programme ne sera pas de moi...)mais j'ai encore un nouveau probleme, j'y est passe 8h dessus hier et j'arrive pas a trouve.
>
> J'ai rajoute un if qui normalement me permet de
> "d'incrementer" le nom d'un fichier pour que par exemple (dans mon cas ) si j'ai:
>
> - Dans mon premier repertoire le fichier St._Thomas1.dbf
> - Dans mon second repertoire les fichiers :
>
> report.txt
> St._Thomas1.dbf
> St._Thomas2.dbf
> St._Thomas3.dbf
>
> je veux que ma variable name1char soit St._Thomas4.dbf a la fin de mon programme, le probleme c'est que cela marche parfaitement pour la premiere boucle (name1char="St._Thomas2.dbf) mais ensuite ecla ne marche plus (voir plus bas).
>
> Mon programme :
>
> #include 
> #include <windows.h>
> #include <stdlib.h>
> #include<stdio.h>
> #include<string.h>
> #include<direct.h>
> #include<conio.h>
> 
> void tolist(LPCTSTR file);
> void tocompare(LPCTSTR file);
> 
> char name1[255];
> char name2[255];
> 
> void main()
> {
>     tolist("C:\\Shapefile\\*.*");
>     tocompare("C:\\Report\\*.*");
> }
> 
> void tolist(LPCTSTR file)
> {
>     WIN32_FIND_DATA wData;
>     BOOL re;
>     HANDLE listing;
>     listing = FindFirstFile(file, &wData);
> 
> re=TRUE;
> 
> do 
> {
>     re = FindNextFile(listing, &wData);
>     strcpy(name1,wData.cFileName);
> } 
> while (re); 
> 
> }  
> 
> 
> void tocompare(LPCTSTR file)
> {
>     WIN32_FIND_DATA wData2;
>     int length;
>    char lastchar,name1char[255]; 
>     BOOL re;
>     HANDLE listing2;
> 
>     listing2 = FindFirstFile(file, &wData2);
> 
> re=TRUE;
> 
> do 
> {
>    re = FindNextFile(listing2, &wData2);
>    strcpy(name2,wData2.cFileName);
>    printf("\n\nname1char avant le if : %s",name1char);
>    printf("\nname2 avant le if : %s",name2);
>    strcpy(name1char,name1);
> 	  
> 	if (strcmp(name1char,name2) == 0)
> 	{
> 	  length=strlen(name1char);
> 	  lastchar=name1char[length-5];
> 	  name1char[length-5]=lastchar+1;
> 	  printf("\nlastchar : %c",lastchar);
>       printf("\nname1char a la fin du if : %s",name1char);
> 	}
> 	printf("\nname1char apres le if : %s",name1char); 
> } 
> while (re); 
>   
> }  
> 

>
>
> et j'ai en resultat qd j'execute mon programme cela :
>
> 
> name1char avant le if : sdsdsdsdsdsdsdsd&#
> name2 avant le if : ..
> name1char apres le if : St._Thomas1.dbf
> 
> name1char avant le if : St._Thomas1.dbf
> name2 avant le if : report.txt
> name1char apres le if : St._Thomas1.dbf
> 
> name1char avant le if : St._Thomas1.dbf
> name2 avant le if : St._Thomas1.dbf
> lastchar : 1
> name1char a la fin du if : St._Thomas2.dbf
> name1char apres le if : St._Thomas2.dbf
> 
> name1char avant le if : St._Thomas2.dbf
> name2 avant le if : St._Thomas2.dbf
> name1char apres le if : St._Thomas1.dbf
> 
> name1char avant le if : St._Thomas1.dbf
> name2 avant le if : St._Thomas3.dbf
> name1char apres le if : St._Thomas1.dbf
> 
> name1char avant le if : St._Thomas1.dbf
> name2 avant le if : St._Thomas3.dbf
> name1char apres le if : St._Thomas1.dbfPress any key to continue

>
> Si vous pouviez m'aider....merci
>
>
>
> -------------------------------
> RsSponse au message :
> -------------------------------
>
> > Erreur classique: tu fais pointer tes variables 'name1' et 'name2' sur une adresse msSmoire locale aux fonctions 'tolist()' et 'tocompare'. Une variable locale est dsStruite en sortant de la fonction osZ elle est dsSclarsSe.
> >
> > Pour rsSsoudre ton problssme, tu peux par exemple utiliser la fonction strdup():
> >
> > name1=strdup(wData.cFileName);
> >
> > // Utilisation de name1
> > // ...
> >
> > // LibsSration
> > free(name1);
> >
> > Kaid
> >
> > -------------------------------
> > RsSponse au message :
> > -------------------------------
> >
> > > Voila, j'essaie de faire un bout de code qui me permet :
> > >
> > > -D'enumerer les fichiers de deux repertoire different (ca ca marche),
> > > -Et ensuite mettre le nom de ces fichiers dans 2 variables : name1 et name2 (en considerant qu'il n'y a qu'1 fichier par repertoire) pour pouvoir ensuite les manipuler (ca ca marche pas).
> > >
> > > Mais j'ai un Pb, mes 2 variables name1 et name2 ont la meme valeur et j'ai meme des signes bizarre en sortie.
> > >
> > > Voila mon code:(si vous pouviez m'aider je vous en serez tres reconnaissant!!!!!)
> > >
> > >
> > >
> > >
> > >
> > > #include 
> > > #include <windows.h>
> > > #include <stdlib.h>
> > > #include<stdio.h>
> > > #include<string.h>
> > > #include<direct.h>
> > > #include<conio.h>
> > > 
> > > 
> > > void tolist(LPCTSTR file);
> > > void tocompare(LPCTSTR file);
> > > 
> > > 
> > > char *name1=NULL;
> > > char *name2=NULL;
> > > 
> > > 
> > > void main()
> > > {
> > >     tolist("C:\\Shapefile\\*.*");    //1er repertoire ds lequel je cherche
> > >     tocompare("C:\\Report\\*.*");//2eme repertoire dans lequel je cherche
> > >     printf("\n%s",name1);
> > >     printf("\n%s",name2);
> > >  }
> > > 
> > > void tolist(LPCTSTR file)  //fonction d'enumeration des fichiers d'un repertoire
> > > {
> > >     WIN32_FIND_DATA wData;
> > >     BOOL re;
> > >     HANDLE listing;
> > > 
> > >     listing = FindFirstFile(file, &wData);
> > > 
> > > re=TRUE;
> > > do 
> > > {
> > >     re = FindNextFile(listing, &wData);
> > > 	name1=wData.cFileName;
> > > } 
> > > while (re); 
> > > 
> > > }  
> > > 
> > > //----------------------------------------------------------------
> > > 
> > > void tocompare(LPCTSTR file) //meme fonction d'enumeration avec juste                                    //wData2 et listing2 a la place de wData1 et listing1
> > > 
> > > {
> > >     WIN32_FIND_DATA wData2;
> > >     BOOL re;
> > >     HANDLE listing2;
> > > 
> > >     listing2 = FindFirstFile(file,    &wData2);
> > > 
> > > re=TRUE;
> > > do 
> > > {
> > >     re = FindNextFile(listing2, &wData2);
> > > 	name2=wData2.cFileName;
> > > 
> > > } 
> > > while (re); 
> > >     
> > > }  

> >
>
0
Rejoignez-nous