[C] Traitement d'un fichier texte

Utilisateur anonyme -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Contributeur Dernière intervention   1 846
 
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
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Contributeur Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846
 
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
 
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   Statut Contributeur Dernière intervention   1 846
 
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
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Tu dois faire quelque chose de genre
"<a href=\"%TAILLE\">"
--
106485010510997108
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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