[C] Traitement d'un fichier texte
Fermé
Utilisateur anonyme
-
8 mars 2009 à 14:06
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 10 mars 2009 à 11:47
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 10 mars 2009 à 11:47
A voir également:
- [C] Traitement d'un fichier texte
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
8 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
8 mars 2009 à 14:09
8 mars 2009 à 14:09
Salut,
Pour te positionner dans le fichier, tu as :
Pour connaître l'utilisation, tu consultes le man ou sur google.
Pour lire le fichier, tu as fgets ou fscanf.
Cdlt
Pour te positionner dans le fichier, tu as :
int fseek(FILE *stream, long offset, int whence); int fsetpos(FILE *stream, fpos_t *pos);
Pour connaître l'utilisation, tu consultes le man ou sur google.
Pour lire le fichier, tu as fgets ou fscanf.
Cdlt
Utilisateur anonyme
8 mars 2009 à 14:29
8 mars 2009 à 14:29
En fait je suis dans un fichier html, et je cherche à trouver une balise comme <div id="menu"> pour sortir d'une boucle.
Je ne sais pas comment mettre ça en place ...
Je ne sais pas comment mettre ça en place ...
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
8 mars 2009 à 14:34
8 mars 2009 à 14:34
Tu lis le fichier ligne par ligne et tu t'arrêtes lorsque la fonction strstr ne vaut pas NULL.
Voici le prototype : char *strstr(const char *meule_de_foin, const char *aiguille);
Voici le prototype : char *strstr(const char *meule_de_foin, const char *aiguille);
Utilisateur anonyme
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
8 mars 2009 à 14:51
8 mars 2009 à 14:51
Comme ça ?
// Scan la page et cherche les menus FILE * fp = fopen("./startpage.html", "r"); while (fp != NULL) { fgets(chaine, TAILLE_MAX, fp); if (strstr(chaine, "<div id=\"menu\">") != NULL) { // Suite des instructions } } fclose(fp);
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
8 mars 2009 à 14:58
8 mars 2009 à 14:58
Non, ta condition du while est mauvaise.
Si tu veux sortir de la boucle while, tu peux mettre un break; tout simplement.
Cdlt
FILE * fp = fopen("./startpage.html", "r"); if(fp==NULL) { fputs("erreur lecture fichier\n",stderr); exit(1); } while(fgets(chaine, sizeof chaine, fp)!=NULL) { if (strstr(chaine, "<div id=\"menu\">") != NULL) { // Suite des instructions } } fclose(fp),fp=NULL;
Si tu veux sortir de la boucle while, tu peux mettre un break; tout simplement.
Cdlt
Utilisateur anonyme
8 mars 2009 à 15:15
8 mars 2009 à 15:15
Ensuite j'ai dans la page
Je reconnait la ligne grâce à :
Je voudrais récupérer le lien qui se trouve après <li><a href="
Comment dois-je procéder sachant que le lien n'a pas une longueur constante ?
Merci beaucoup
<li><a href="http://***.***.***/" onclick="window.open(this.href); return false;">***</a></li>
Je reconnait la ligne grâce à :
while(fgets(chaine, sizeof chaine, fp)!=NULL) { if (strstr(chaine, "<li><a href=\"") != NULL) { } }
Je voudrais récupérer le lien qui se trouve après <li><a href="
Comment dois-je procéder sachant que le lien n'a pas une longueur constante ?
Merci beaucoup
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
8 mars 2009 à 16:29
8 mars 2009 à 16:29
La chaîne que tu veux récupérer est comprise entre // et /.
Tu peux donc t'en servir comme délimiteur.
Dans chaine tu as <li>...</li>
Tu peux donc faire : strstr pour avoir un pointeur sur //xxx.xxx.xxx/........</li>
Et ensuite un sscanf pour récupérer xxx.xxx.xxx
Ce qui donne par exemple :
Tu peux donc t'en servir comme délimiteur.
Dans chaine tu as <li>...</li>
Tu peux donc faire : strstr pour avoir un pointeur sur //xxx.xxx.xxx/........</li>
Et ensuite un sscanf pour récupérer xxx.xxx.xxx
Ce qui donne par exemple :
char adresse[50]; char *p=strstr(chaine,"//"); if(p) { sscanf(p,"//%49[^/]",adresse); } puts(adresse);
Je te remercie, grâce à toi j'ai quelque chose qui fonctionne ;)
Mais pourtant j'ai beau chercher sur internet depuis ta dérnière réponse, je ne trouve pas comment utilise sscanf pour faire un tel découpage ... peux-tu m'expliquer son fonctionnement exacte s'il te plait ?
Et je pense qu'après je ne t'embête plus ^^
Merci encore.
Mais pourtant j'ai beau chercher sur internet depuis ta dérnière réponse, je ne trouve pas comment utilise sscanf pour faire un tel découpage ... peux-tu m'expliquer son fonctionnement exacte s'il te plait ?
Et je pense qu'après je ne t'embête plus ^^
Merci encore.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
9 mars 2009 à 20:12
9 mars 2009 à 20:12
Salut,
L'explication tu la trouves dans man sscanf
L'explication tu la trouves dans man sscanf
[ Correspond à une séquence non vide de caractères appartenant à un ensemble donné. Le pointeur correspondant doit être un pointeur vers un char et il doit y avoir suffisamment de place dans le tableau de caractères pour accueillir la chaîne ainsi qu'un octet nul final. Les caractères blancs du début ne sont pas supprimés. La chaîne est constituées de caractères inclus ou exclus d'un ensemble donné. L'ensemble est composé des caractères compris entre les deux crochets [ et ]. <gras>L'ensemble exclut ces caractères si le premier après le crochet ouvrant est un accent circonflexe (^). Pour inclure un crochet fermant dans l'ensemble, il suffit de le placer en première position après le crochet ouvrant, ou l'accent circonflexe ; à tout autre emplacement il servira à terminer l'ensemble. Le caractère tiret - a également une signification particulière. Quand il est placé entre deux autres caractères, il ajoute à l'ensemble les caractères intermédiaires. Pour inclure un tiret dans l'ensemble, il faut le placer en dernière position avant le crochet fermant. Par exemple, [^]0-9-] correspond à l'ensemble « Tout sauf le crochet fermant, les chiffres de 0 à 9, et le tiret ». La chaîne se termine dès l'occurrence d'un caractère exclu (ou inclus s'il y à un accent circonflexe ) de l'ensemble, ou dès qu'on atteint la longueur maximale du champ.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
10 mars 2009 à 10:10
10 mars 2009 à 10:10
Salut,
Tu dois faire quelque chose de genre
106485010510997108
Tu dois faire quelque chose de genre
"<a href=\"%TAILLE\">"--
106485010510997108
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
10 mars 2009 à 11:47
10 mars 2009 à 11:47
Si ch est de taille 50, et que buf contient ta chaîne, alors :
récupérera l'adresse www.rien.com/...
char *p=strstr(buf,"//"); sscanf(p,"//%49[^\"]",ch);
récupérera l'adresse www.rien.com/...