IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Parcourir fichier à indenter


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BFH
    BFH est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 45
    Par défaut Parcourir fichier à indenter
    Bonjour, je dois ecrire une fonction qui parcours un fichier HTML et qui indente les balises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html><head><title></title></head></html>
    Voila ce que je dois obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <html>
      <head>
        <title>
        </title>
      </head>
    </html>
    Au depart je pensait parcourir le fichier avec un getchar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while((c=getchar())!=EOF)
    {switch{case '<' : etc...}}
    Sauf que getchar() ça ne fonctionne que sur 1 seul caractere et moi il me faudrait un truc qui me permette de traiter 2 caractères dans mon switch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    switch{case '</' : ...}
    Qu'est ce que je peux utiliser?

  2. #2
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Ben tu peux lire une chaine de caractère grâce à fgets par exemple (entre autre). Mais avant tout ecris un algo car avec ta chaine tu ne sera pas mécéssairement plus avancé.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Voir du côté des automates pour l'algo.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Parcourir fichier à indenter
    Citation Envoyé par BFH
    Bonjour, je dois ecrire une fonction qui parcours un fichier HTML et qui indente les balises :
    C'est un sujet interessant, mais qui est plus complexe qu'il n'y parait. Quelles sont tes connaissances en algorithmique, structures de données et langage C ?
    Est-ce un projet scolaire ou industriel ?

  5. #5
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    tu peux utiliser: strpbrk ().
    tu mets < comme separateur et t'auras une chaine: <html>

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
    #include <string.h>
     
     
    int main (void)
    {	
     
    char *token;
    char line[100],s1[100];
    char *s2="*%#$";
    char *separator="( )'+*";
     
    strcpy(line,"(car (cdr '(a b c)))");
    strcpy(s1,"orange banane pomme *poire");
     
    /* first call to strtok() */
    	token = strtok (line, separator) ;
    	while (token != NULL)
    	{	puts (token) ;
    		token = strtok (NULL, separator) ; }
    /* test call to strpbrk */
    	puts (strpbrk (s1, s2)) ;
     
    	system("PAUSE");
    	return 0 ; }
    et tu obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    car
    cdr
    a
    b
    c
    *poire

  6. #6
    BFH
    BFH est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 45
    Par défaut
    Bonjour,
    désolé de ne pas avoir repondu avant, je ne pouvais pas.

    Ceci est un projet scolaire.
    En ce qui concerne mes connaissances en C elles sont limitées car c'est la premiere année que j'en fait, avant je faisait plutot du multimedia...

    Sinon coté algo, j'avais pensé a un truc tout simple:
    _ entier compteur_tabulations=0;
    _parcourir le fichier ".htm" ligne par ligne
    _des qu'on recupere 1 ligne on la parcour pour voir si on trouve le caractere '<'
    _dès qu'on trouve '<' on regarde juste apres pour voir si on a :
    'A' <=caractere[i]<='Z'
    Ou BIEN
    caractere[i]==' '
    _suivant le cas on fait :
    pour(j=0; j<=compteur_tabulations;j++)
    mettre '\t' devant '<';

    compteur_tabulations++;
    OU
    pour(j=0; j<=compteur_tabulations;j++)
    mettre '\t' devant '<'

    compteur_tabulations--;

    Bon et puis j'ai pris plein d'autres choses en compte dans mon algo
    Enfin, je trouve que je me suis pas trop mal debrouillé pour le faire mais j'avoue que j'ai des problemes en programmation C:

    Voila une partie de mon code qui n'est pas finit, si vous voyez deja des problemes des trucs à ameliorer dites le!
    Pareil si vous avez des conseils, je suis preneur; en tant que débutant je ne demande qu'a progresser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    FILE *Indenter(FILE * fichier)
    {
        int i=0;
        int j;
        int compteur_tabulations=0;
        int Nombre=Compter_Max_Car();
        char ligne[Nombre];
     
        while(fgets(ligne,Nombre+1,fichier)!=NULL)
        {
            while (ligne[i]!='\0')  /*Tant qu'on est pas à la fin de la ligne recupérée par fgets */
    		{
                if(ligne[i]!='\t' && ligne[i+1]=='<' && ('A'<=ligne[i+2]<='Z'))/*Si une balise ouvrante n'est pas précédée d'une tabulation*/
                {
                    for(j=0;j<=compteur_tabulations;j++)
                    {
                        putc('\t',fichier);
                    }
                    compteur_tabulations++;
                }
                else
                    if(ligne[i]!='\t' && ligne[i+1]=='<' && ligne[i+2]=='\\')
                    {
                        putc('\n',fichier);
                        compteur_tabulations--;
                        for(j=0;j<=compteur_tabulations;j++)
                        {
                            putc('\t',fichier);
                        }
                    }
            }
        }
        return fichier;
    }

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par BFH
    Voila une partie de mon code qui n'est pas finit, si vous voyez deja des problemes des trucs à ameliorer dites le!
    Ce code est incomplet et erroné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    main.c: In function `Indenter':
    main.c:6: warning: implicit declaration of function `Compter_Max_Car'
    main.c:13: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
    Il est une regle de conception XP (eXtrem Programming) qui dit que chaque étape doit être stable c'est à dire compilable et fonctionnelle. Ce n'est pas le cas ici. On ne peux rien vérifier sans ajouter une partie de code importante. Ce n'est pas à nous de faire ça.

    Quand à l'algo, il me parait bien compliqué. S'agissant de logique séquencielle (la combinaison d'un état courant et d'un évènement entraite un changement d'état éventuel et une action éventuelle), c'est du travail pour une machine à états finis (FSM ou automates, ).

    Si tu n'as pas eu de cours sur le FSM, travaille ton algorithme, mais essaye de rester séquenciel.

    tokénisation par ligne
    - balise
    - données
    evaluation du niveau d'indentation
    ajout des espaces en tête
    ecriture de la nouvelle ligne

Discussions similaires

  1. [JDOM] Parcourir fichier XML
    Par Nemesis007 dans le forum Format d'échange (XML, JSON...)
    Réponses: 14
    Dernier message: 28/08/2008, 11h38
  2. parcourir fichier d'un zip
    Par Didier77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 01/05/2008, 06h50
  3. Bouton parcourir / fichier
    Par kikouu dans le forum Forms
    Réponses: 6
    Dernier message: 26/04/2007, 16h16
  4. Pb Boucle VB6 pour parcourir fichier TXT en VB6
    Par C_Mila dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/02/2007, 11h22
  5. Réponses: 6
    Dernier message: 14/04/2006, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo