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 :

Lire un même caractère 2 fois de suite


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Lire un même caractère 2 fois de suite
    Bonsoir,

    J'aimerais savoir s'il est possible de lire un caractère 2 fois de suite. Je m'explique. Je lis le caractère une première fois, je vérifie si la condition pour sortir de ma boucle principale est là ou non. Si jamais elle n'est pas vérifiée alors j'aimerais envoyé le contenu tel quel saisis au clavier avec le premier caractère que j'ai déjà lu à une fonction décrit dans un autre fichier.
    J'avoue c'est un peu compliqué.

    Un moyen possible c'est d'envoyer le premier caractère lu en paramètre à ma fonction mais j'aimerais savoir si c'est possible autrement i.e lire un caractère sans faire avancer "le curseur de lecture"

    ((C'est lié à mon projet info de 2e année où je dois programmer un analyseur syntaxique.))

    Merci d'avance.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par H.Filbert
    J'aimerais savoir s'il est possible de lire un caractère 2 fois de suite. <...>
    ungetc() ? Jamais utilisé, mais il y a un exemple dans le K&R...

    http://man.developpez.com/man3/ungetc.3.php

  3. #3
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    et tu est oblige de le relire?? tu ne peux pas faire une concatenation de deux chaines pour retrouver ce que tu avais a l'ecran???

    c'est pas forcement le mieu mais ca peut etre une solution

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    ungetc() ? Jamais utilisé, mais il y a un exemple dans le K&R...

    http://dpobel.free.fr/man/html/affiche_man.php/4393/man/ungetc/
    ungetc (int c, FILE *stream)
    J'ai regardé mais je ne suis pas sur si ça convient ou non. J'ai l'impression qu'il remet le caractère mais au bout de la saisie... je n'ai pas pu tester, je ne sais pas comment manipuler le type FILE.

    Citation Envoyé par doudouallemand
    et tu est oblige de le relire?? tu ne peux pas faire une concatenation de deux chaines pour retrouver ce que tu avais a l'ecran???

    c'est pas forcement le mieu mais ca peut etre une solution
    Envoyer le caractère en paramètre avec la fonction appelé est bien plus simple à vrai dire. Je crois bien que c'est la seule solution d'ailleurs.
    Normalement je dois le lire mais je pense que je n'ai pas vraiment le choix là.

    Je m'explique très brièvement sur mon projet:
    J'ai un langage basique avec 4 mots clefs ou encore lexique:
    {triangle, carre, *, #}

    Je dois faire une analyse lexicale qui reconnait ces mots de mon lexique et les transforme en symbole qui peuvent être interpreté par mon analyseur syntaxique. Celui-ci donne un résultat final si tout s'est bien passé.
    exemple:
    - triangle => affichage d'un triangle
    - *carre => rotation de mon motif carré
    - triangle # carre => affichage d'un triangle à coté d'un carré

    Maintenant qu'on a codé ça, on doit enrichir notre lexique et notre analyseur (c'est l'équivalent d'un compilateur pour un langage donné mais en beaucoup beaucoup plus simple).

    Pour lancer mon programme, je lui donne un nom de fichier en paramètre qui contient les données à analyser.
    Maintenant j'aimerais transformer ça en un interpréteur de commandes i.e. que je saisis quelque chose au clavier et dès que j'appuie entrer il m'affiche le résultat et il devient prêt pour une nouvelle saisie.
    Donc je suis obligé de mettre une boucle "tant que" dans mon main et je dois aussi gèrer sa condition de sortie tous en gardant intact, si possible, ce que j'ai entré dans le clavier... j'espère ne pas rendre les choses trop incompréhensible pour vous là

  5. #5
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Dans ce cas, pourquoi ne pas utiliser fgets pour lire une ligne ?

    Si ligne = "exit" alors tu sors de ta boucle, sinon tu l'envois à ta fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char ligne[100];
    fgets(ligne, sizeof ligne, stdin);

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    je ne sais pas comment manipuler le type FILE.
    C'est simple, mais je crois que ici FILE peut aussi être un flux:
    stdin en l'occurence.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    stdin est un FILE*

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    lire un caractère sans faire avancer "le curseur de lecture"
    J'ai peut être pas compris mais:
    kbhit() pour vérifier les frappes clavier et getch() pour les récupérer et traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(1){
             if(kbhit()){
                         c=getch();
                         if(c=='a' || c=='z' || c=='e'){
                                               printf("%c",c);
                                               }
    }
    }
    n'affiche que les frappes sur 'a','z' ou 'e'.

    Mais attention ce n'est pas portable.

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    stdin est un FILE*
    Et un FILE* est un flux?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Et un FILE* est un flux?
    Ben oui. Il n'est pas inutile d'ouvrir son livre de C de temps en temps. Par exemple le K&R2 chap.7...

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est parce que je ne comprenait pas la remarque de Skyrunner qui semblait me contredire sur le fait que stdin est un flux.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Mayti4
    Dans ce cas, pourquoi ne pas utiliser fgets pour lire une ligne ?

    Si ligne = "exit" alors tu sors de ta boucle, sinon tu l'envois à ta fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char ligne[100];
    fgets(ligne, sizeof ligne, stdin);
    ça ne marche pas car je peux très bien écrire les données sur plusieurs lignes:
    exemple:
    triangle
    #
    carre

    Citation Envoyé par seriousme
    J'ai peut être pas compris mais:
    kbhit() pour vérifier les frappes clavier et fgetc() pour les récupérer et traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(1){
             if(kbhit()){
                         c=getch();
                         if(c=='a' || c=='z' || c=='e'){
                                               printf("%c",c);
                                               }
    }
    }
    n'affiche que les frappes sur 'a','z' ou 'e'.

    Mais attention ce n'est pas portable.
    Non ce n'est pas vraiment ça. Voici un petit 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
     
    char c;
    c = getchar();
     
    while(c != 'q')
    {
      Appel de fonction G;
      printf("\nEntrer une nouvelle expression:\n");
      /*A ce moment, l'utilisateur rentre soit une nouvelle expression 
    comme "triangle#carre;", soit il écrit 'q' pour quitter le programme.*/
     
      c = getchar();
      /* si c != q alors j'aimerais faire appel à G en lui donnant le caractère
     contenu dans c qui soit inclus au debut du buffer*/
    }
    Une expression est un ensemble de mots de mon lexique qui peuvent être plus ou moins complexe. Toutes se terminent par un ';' comme en c.

    Exemple d'utilisation:
    soit m = triangle, s = carre
    dans m # s ;
    => le résultat serait l'affichage d'un triangle à côté d'un carré.
    ((Ici le lexique est un peu plus enrichis: Lexique = {"triangle", "carre", "soit", ';', ',', '=', '#', '*','ID'}))

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai fais des tests avec la fonction "ungetc" et ça marche =)
    Merci à tous de m'avoir aidé ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Lire plusieurs tables avec des join ou requête à chaque fois à l'intérieur d'une boucle
    Par padre.cedano dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/01/2015, 09h44
  2. Le grand mode d'emploi du forum, à lire si vous souhaitez tout savoir !
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 03/06/2013, 17h36
  3. impossible de lire 2 fois de suite un fichier
    Par porcher dans le forum C++
    Réponses: 8
    Dernier message: 14/02/2005, 01h44
  4. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31
  5. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11

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