Recherche dans fichier texte

Résolu
picollus Messages postés 4 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 24 août 2004 - 26 août 2004 à 16:06
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004 - 27 août 2004 à 01:07
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

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 août 2004 à 00:48
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;

}
3
DevGizmo Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 27 février 2007 1
26 août 2004 à 16:15
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 );
}
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
26 août 2004 à 17:53
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 :)

++
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
26 août 2004 à 18:21
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
0

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

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
26 août 2004 à 18:25
C vrai, pardon...
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
27 août 2004 à 00:14
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;
}

@+
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 août 2004 à 00:19
ca fuie :)
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
27 août 2004 à 00:21
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 !
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 août 2004 à 00:25
fais pas de fscan, aspire tout dans un buffer et fais un coup de strstr, plus simple et plus rapide
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 août 2004 à 00:25
et n'oublie pas de fermer le fichier sinon ca fuis
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
27 août 2004 à 00:40
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 !
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
27 août 2004 à 00:48
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
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 août 2004 à 00:49
ne fais jamais scanf("%s"...)
toujours utiliser fgets
0
picollus Messages postés 4 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 24 août 2004
27 août 2004 à 01:05
merci pour beaucoup pour votre aide, je vais essayer tout ca

ps: je code avec le programme dev-c++ sous window xp
0
cs_pjb Messages postés 19 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 17 août 2004
27 août 2004 à 01:07
yes ! je sais...

beaucoup plus court que le mien !

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

merci beaucoup, je vais me coucher moins con...
0
Rejoignez-nous