Recherche dans fichier texte [Résolu]

picollus 4 Messages postés mardi 24 août 2004Date d'inscription 24 août 2004 Dernière intervention - 26 août 2004 à 16:06 - Dernière réponse : cs_pjb 19 Messages postés vendredi 13 août 2004Date d'inscription 17 août 2004 Dernière intervention
- 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
Afficher la suite 

Votre réponse

15 réponses

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

}

Merci cs_djl 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_djl
DevGizmo 122 Messages postés lundi 16 décembre 2002Date d'inscription 27 février 2007 Dernière intervention - 26 août 2004 à 16:15
0
Merci
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 );
}
Commenter la réponse de DevGizmo
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 26 août 2004 à 17:53
0
Merci
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 :)

++
Commenter la réponse de cs_AlexMAN
cs_djl 3011 Messages postés jeudi 26 septembre 2002Date d'inscription 27 novembre 2004 Dernière intervention - 26 août 2004 à 18:21
0
Merci
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
Commenter la réponse de cs_djl
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 26 août 2004 à 18:25
0
Merci
C vrai, pardon...
Commenter la réponse de cs_AlexMAN
cs_pjb 19 Messages postés vendredi 13 août 2004Date d'inscription 17 août 2004 Dernière intervention - 27 août 2004 à 00:14
0
Merci
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;
}

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

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

beaucoup plus court que le mien !

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

merci beaucoup, je vais me coucher moins con...
Commenter la réponse de cs_pjb

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.