Recherche d'une chaine dans un fichier

ymlf Messages postés 8 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 janvier 2004 - 27 oct. 2003 à 17:35
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 28 oct. 2003 à 19:26
Problème au niveau du scanf()

int recherche(char *chaine,char *FileName)
{
int i, k;
char *tmp, *tab[50], *timer[20];

FILE *svf;
svf=fopen(FileName,"r");
printf("fichier ouvert");
i=0; k=0;
while(fscanf(svf,"%c, [^\n]",tab[i])!=EOF)// test si ce n'est pas la fin du fichier
{
if(tab[i]!=" ")// recherche les espaces
{
tmp=strcat(tmp,tab[i]); // récupère le mot dans temp
if(tmp==chaine) // test si le mot est un tag timer
{
if ( ( tab[i]=="(" ) && ( tab[i+1]==""" ))
{
while(tab[i]!=""")
{
timer[k]=strcat(timer[k],tab[i]);
i++;
}
k=k++;
printf("\n le timer numero %c", k);
printf("\n le timer %c", timer);
}

}
i++;
}
}
return 0;
}

11 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
27 oct. 2003 à 17:43
Salut,
*tab[50] est un tableau de 50 pointeurs, pas un pointeur sur une chaine de 50 caracteres.

char tab[50]; // devrait etre mieux
0
ymlf Messages postés 8 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 janvier 2004
27 oct. 2003 à 18:06
Merci exact

mais j'ai toujours une erreur au debug à
while(fscanf(svf,"%c, [^\n]",tab[i])!=EOF)
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
27 oct. 2003 à 18:14
Je n'ai pas beaucoup regardé le code mais ya déja des choses qui saute aux yeux :

if(tmp==chaine)
la tu teste les pointeurs, si tu veux faire une comparaison des chaines, utilise strcmp()

tmp=strcat(tmp,tab[i]);
tu inscrit des données ds tmp (un pointeur qui pointe sur rien), fait une allocation dynamique ou utilise un tableau de char normal
et puis inutile de mettre le "tmp="

k=k++;
a quoi ca sert ? mettre uniquement k++;
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
27 oct. 2003 à 20:30
et pi :
printf("\n le timer numero %c", k);
k est un int, donc faut mettre un %d

printf("\n le timer %c", timer);
timer est définit comme une chaine de caractère, donc %s
0

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

Posez votre question
ymlf Messages postés 8 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 janvier 2004
28 oct. 2003 à 09:15
merci à tous, mais malgrès tous vos coup de main ca ne marche tjs pas!

int recherche(char *chaine,char *FileName)
{
int i, k;
char *tmp, tab[50], *timer[20];

FILE *svf;
svf=fopen(FileName,"r");
printf("fichier ouvert");
i=0; k=0;
while(fscanf(svf,"%c, [^\n]",tab[i])!=EOF)// test si ce n'est pas la fin du fichier
{
if(&tab[i]!=" ")// recherche les espaces
{
tmp=strcat(tmp,&tab[i]); // récupère le mot dans temp
if(strcmp(tmp,chaine)) // test si le mot est un tag timer
{
if ( ( &tab[i]=="(" ) && ( &tab[i+1]==""" ))
{
while(&tab[i]!=""")
{
timer[k]=strcat(timer[k],&tab[i]);
i++;
}
k++;
printf("\n le timer numero %c", k);
printf("\n le timer %c", timer);
}

}
i++;
}
}
return k;
}
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 oct. 2003 à 14:16
Salut,
Ce que j'ai dit pour tab est egalement valable pour timer.

if(&tab[i]=="(")
alors la tu compares l'adresse mémoire du i-eme element du tableau tab a une chaine de caractere... ca marchera jamais.
if(tab[i] == ')') // ca c bon, comparaison de 2 octets avec ==

Sinon tout a fait a part, pour rechercher une chaine dans un fichier, pourquoi ne pas copier tout le fichier dans un buffer, mettre un 0 a la fin, et faire un strstr() sur le buffer ?
0
ymlf Messages postés 8 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 janvier 2004
28 oct. 2003 à 15:54
Le problème est que je recherche des TAG "startimer" dans un fichier bas je voudrais récupérer ce qu'ils contiennent dans un

tableau : timer[].



int recherche(char *chaine, char *nom_scn)
{
int i, k;
char tmp, tab[1500], timer[200], *FileName;
char cheminsrc[256]=" c:\\progra~1\\scénario\";
FILE *svf;

//initialisation
printf("Récupération des timers\n");
i=0; k=0;

//création du chemin et ouverture du fichier
strcat(nom_scn,".bas");
strcat(cheminsrc,nom_scn);
strcpy(FileName,cheminsrc);

/*c:/program files/scenario/nom_scn.bas*/

svf=fopen(FileName,"t");
printf("fichier source ouvert\n");

while(!(feof(svf)))
// attente la fin du fichier le problème et que je ne suis pas certain que ca fonctionne avec des fichiers .bas ouvert avec

l'option t

{
if( tab[i] != " ") // recherche les espaces ( PB tab[i] recherche un int ? )
{
strcat(tmp , tab[i]); // récupère le mot dans temp
if(strcmp(tmp,chaine)) // test si le mot est un tag timer
{
if ( ( tab[i] == "(" ) && ( tab[i+1] == """ ))
{
while(tab[i] != """)
{
strcat(timer[k],tab[i]);
i++;
}
k++;
printf("\n le timer numero %c", k);
printf("\n le timer %c", timer);
}
}
i++;
}
}
return 1;
}
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 oct. 2003 à 16:14
Salut,
Ca sert a rien de recopier le code a chaque fois si tu corriges pas ce qui est faux.
if (tab[i] == "(") // est faux. il faut mettre '('.
"(" est une chaine de caractere.
'(' est un octet.

Explique plutot comment trouver les tags dont tu a besoin dans tes fichiers .bas, comment on peut les repérer précisement, etc..
Ou mieux donne un bout de fichier .bas...
0
ymlf Messages postés 8 Date d'inscription mardi 14 octobre 2003 Statut Membre Dernière intervention 2 janvier 2004
28 oct. 2003 à 18:21
En fait je cherhce à récuperer le nom des timers : ttest1
je recherche la sequence StartTimer.
Puis ("
recup du nom du timer jusqu'à la fermeture de la paranthèse.

En un second temps

Le script a cette tête.

Sub StartScript()

InitScript

ThinkTime ("0.750")

returnStatus = ClickOnImageRTR("scenarioRTR0.bmp", LEFT_BUTTON, 0)
If returnStatus <> SUCCESS Then
AbortScriptEx (SCRIPT_FAIL)
Exit Sub
End If

returnStatus = ClickEx(LEFT_BUTTON, TWO_CLICKS)

StartTimer ("ttest1")
returnStatus = ClickEx(LEFT_BUTTON, ONE_CLICK)

....

StopTimer ("ttest1")

...

End Sub

A terme je voudrais bien verifier si le timer se ferme bien : sequence StopTimer("timer")
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 oct. 2003 à 19:07
Salut,
Deja le mieux c'est d'initialiser tab[1500] a 0 et de lire tout ton fichier dedant.
Pour reperer un "StartTimer", soit tu fait avancer un pointeur et tu teste avec strncmp(...), soit tu fais un strstr(...) sur le buffer.
Une fois que tu as trouvé un StartTimer, tu affiche ce qui se trouve entre les (" ") et tu continue jusqu'a la fin (0 final).
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 oct. 2003 à 19:26
Salut,
Voici un bout de code illustrant ce que j'ai dit plus haut, avec strstr(..).

int lecture_fichier(char * chaine, char * path)
{
FILE * File;
int i = 0;
char tab[1024];
char timer[128];
char * c;
memset(tab, 0, 1024); // buffer a 0

File = fopen(path, "r");
while((tab[i] = fgetc(File))!= EOF) i++; // ecrit le fichier dans le buffer

c = tab; // c est le pointeur que l'ont va avancer

while(c = strstr(c, chaine))
{
// c pointe sur StarTimer, on rajoute donc strlen(chaine)+3 pour pointer
// sur ce qu'il y a apres le "
c += strlen(chaine)+3;
i = 0;while(*c !'"') timer[i++] *c++; // on copie
timer[i] = 0; // on n'oublie pas le zero final
printf("Timer: %s\n", timer);
}
return 0;
}
0
Rejoignez-nous