[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
Salut !
Je suis actuellement en train de programmer un petit logiciel et j'aimerais connaître les méthodes/fonctions qui permettent de naviguer dans un fichier texte et de récupérer une partie du fichier.
Merci d'avance de votre aide.
A voir également:

8 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
8 mars 2009 à 14:09
Salut,
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
0
Utilisateur anonyme
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 ...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
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);
0
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
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);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
8 mars 2009 à 14:58
Non, ta condition du while est mauvaise.

    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
0
Utilisateur anonyme
8 mars 2009 à 15:15
Ensuite j'ai dans la page
<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
0

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 840
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 :
char adresse[50];
char *p=strstr(chaine,"//");
if(p) {
   sscanf(p,"//%49[^/]",adresse);
}
puts(adresse);
0
Utilisateur anonyme
9 mars 2009 à 18:16
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.
0
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 567
9 mars 2009 à 20:12
Salut,

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.
0
Utilisateur anonyme
10 mars 2009 à 07:03
Salut !
Donc si ma chaine de départ est par exemple
<a href="http://www.rien.com/add.php?id=2&amp;from=page1">Lien</a>
et que je veux récupérer le lien, il faut que je m'arrête au dernier guillemet.
Mais ça marche pas ...
0
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 567
10 mars 2009 à 10:10
Salut,

Tu dois faire quelque chose de genre
"<a href=\"%TAILLE\">"
--
106485010510997108
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
10 mars 2009 à 11:47
Si ch est de taille 50, et que buf contient ta chaîne, alors :
char *p=strstr(buf,"//");
sscanf(p,"//%49[^\"]",ch);

récupérera l'adresse www.rien.com/...
0