Recherche dans fichier texte [Résolu]

Signaler
Messages postés
4
Date d'inscription
mardi 24 août 2004
Statut
Membre
Dernière intervention
24 août 2004
-
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004
-
Bonjour

j'ai encore une question à propos d'un petit programme en C (en mode console) que j'essaie de faire.
J'aimerai écrire une fonction qui me dit si le nom de la personne que j'ai introduis au clavier (qui est délcaré dans une structure) se trouve bien dans un fichier texte.
j'éprouve quelques difficultées avec les fonctions qui permettent de lire les données dans un fichier.

merci d'avance

15 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
int findtext(FILE *fp, const char *text,size_t offset)
{
char *buffer, *p;
size_t size;

fseek( fp, offset, SEEK_SET);
size= ftell(fp);
fseek( fp, 0, SEEK_END);
size = ftell(fp) - size;
fseek( fp, offset, SEEK_SET);

buffer = calloc(size + 1, 1);
fread( buffer, size, 1, fp);
p = strstr( text, buffer );
free(buffer);

if(p) return 1;
return 0;

}
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
char ReadInFile(char *szFileName, char *szReaded)
{
FILE *hFile = fopen(szFileName, "r");
if( !hFile ) return -1;

fread( szFileName, <nb_octet_que_tu_veux_lire>, 1, hFile );

fclose( hFile );
}
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
je ne pense pas que son pb soit la lecture de fichier. De plus, je te conseillerai d'utiliser CreateFile(), ReadFile() et CloseHandle() pluto que les fopen et co.
La procedure est simple, et tu as plusieurs possibilités :

-soit lire le fichier et placer TT son contenu ds un buffer, et a partir de la, tu compares a coup de strstr,
-soit lire bloc par bloc, placer ce bloc ds un buffer, et chercher encore a coup de strstr, et placer le pointeur de fichier la ou on s'est arrété de lire (SetFilePointer()), et recommencer cette procedure juska la fin du fichier.

Ts les details de ces fonctions sont ds msdn, et je crois aussi savoir que brunews a codé une fonction de recherche, mate ses sources et inspire toi :)

++
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
il me semble pas avoir lu dans sa question qu'il etait sous windows, si c'est sous linux ca l'aider d'alller voir sur msdn :D
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
C vrai, pardon...
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

voilà un source complet (mais non optimisé, et il peut y avoir des bugs >>> dis le moi dans ce cas...)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/* retourne 0 si introuvable
* retourne 1 sinon
* au premier appel, mettre offset à 0 (cf. main)
* (fonction récursive...)
*/
int findtext(FILE *fp, char *text, int offset)
{
char ch;

if( fscanf(fp, "%c", &ch) <= 0 )
return 0;

if( offset == strlen(text)-1 ){
if( fscanf(fp, "%c", &ch) <= 0)
return 1;

if( ch == ' ' ) /* rajouter si besoin d'autres
caractères d'espacement
comme '-' ou ',' ou ';' ...*/
return 1;

/* else */ return 0;
}

if( ch != text[offset] )
return findtext(fp, text, 0);
else
return findtext(fp, text, offset+1);
}

/* BLOC MAIN */
int main(int argc, char **argv)
{
FILE *fp;
char text[128];

/* ouverture fichier */
fp = fopen("tests.txt","r");

if( !fp ){ /* fichier existant ? */
puts("erreur de lecture !");
exit(1);
}

/* lecture du nom */
fscanf(stdin,"%s",text);

if( findtext(fp, text, 0) )
puts("chaine trouvee !");
else
puts("chaine non trouvee !");

return 0;
}

@+
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ca fuie :)
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

il y a un bug dans mon prog : je ne vérifie pas la présence d'un caractère d'espacement juste avant le premier caractère du mot lu :

par ex : si dans le fichier il y a "bonjour marie !!!"
et que tu cherches "arie", mon prog dit que arie est présent dans le fichier (ce qui est vrai ! mais ce n'est pas ce que tu veux)

si tu veux que je le modifie, dis le moi... (mais je ne pense pas que ce soit important)

salut !
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
fais pas de fscan, aspire tout dans un buffer et fais un coup de strstr, plus simple et plus rapide
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
et n'oublie pas de fermer le fichier sinon ca fuis
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

fscan : t'as raison, mais mon but était de faire sa fonction, le reste après il fait ce qu'il veut...
oui fclose(fp);

je suis fatigué... lol

autre gros bug (hum hum, je suis vraiment fatigué...)

remplacer la ligne "/* else */ return 0;" par :

else
if( ch == text[0] )
return findtext(fp, text, 1);
else
return findtext(fp, text, 0);

salut tout le monde !
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

j'ai fait en fait le fscanf(stdin, "%s"...) pour lire une chaine contenant même au cas ou des espaces car scanf("%s"...) ne lit que le premier mot

mais en fait ça ne marche même pas ! (hum...)
(j'étais sur que ça fonctionnait, je ne sais pas pourquoi...)

salut
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
ne fais jamais scanf("%s"...)
toujours utiliser fgets
Messages postés
4
Date d'inscription
mardi 24 août 2004
Statut
Membre
Dernière intervention
24 août 2004

merci pour beaucoup pour votre aide, je vais essayer tout ca

ps: je code avec le programme dev-c++ sous window xp
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

yes ! je sais...

beaucoup plus court que le mien !

je ne connaissais pas strstr() .....................> :( sniff

merci beaucoup, je vais me coucher moins con...