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 :

Le backspace n'apparait pas


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut Le backspace n'apparait pas
    Bonjour,

    voilà ce petit programme est censé remplacer le backspace \b saisi par \b, pourtant quand je teste ça ne marche pas

    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
    /* --------------------------------------------------------------------------
       Fonction : Remplace les tabulations par \t, les retour en arriere par \b,
                  les backslashs par \\
       -------------------------------------------------------------------------- */
    #include <stdio.h>
     
    int main (void)
    {
       int c;
     
       while ((c = getchar ()) != EOF)
       {
          if (c == '\t')
          {
             printf ("\\t");
          }
          else if (c == '\b')
          {
             printf ("\\b");
          }
          else if (c == '\\')
          {
             printf ("\\");
          }
          else
          {
             putchar (c);
          }
       }
     
       return 0;
    }
    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça ne marche pas sur un terminal normal, car c'est lui qui traite le backspace et le programme ne le "voit" jamais.
    Il faut régler le terminal en mode "raw" (aucun traitement) si tu veux recevoir les backspaces.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Médinoc
    Ça ne marche pas sur un terminal normal, car c'est lui qui traite le backspace et le programme ne le "voit" jamais.
    Il faut régler le terminal en mode "raw" (aucun traitement) si tu veux recevoir les backspaces.
    d'accord j'ai passer le terminal en mode raw (suis sous linux), et le code marche

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    /* --------------------------------------------------------------------------
       Fonction : Remplace les tabulations par \t, les retour en arriere par \b,
                  les backslashs par \\
       -------------------------------------------------------------------------- */
    #include <stdio.h>
    #include <termios.h>
    #include <unistd.h>
     
    #define DEL 127 /* code backspace */
     
    void mode_raw(int activer)
    {
       static struct termios cooked;
       static int raw_actif = 0;
     
       if (raw_actif == activer)
       {
          return;
       }
     
       if (activer)
       {
          struct termios raw;
     
          tcgetattr(STDIN_FILENO, &cooked);
     
          raw = cooked;
          cfmakeraw(&raw);
          tcsetattr(STDIN_FILENO, TCSANOW, &raw);
     
       }
       else
       {
          tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
       }
     
       raw_actif = activer;
    }
     
    int main (void)
    {
       int c;
     
       mode_raw(1);
     
       while ((c = getchar ()) != EOF)
       {
          if (c == '\t')
          {
             printf ("\\t");
          }
          else if (c == 127)
          {
             printf ("\\b");
          }
          else if (c == '\\')
          {
             printf ("\\");
          }
          else
          {
             putchar (c);
          }
       }
     
       mode_raw (0);
     
       return 0;
    }

    vraisemblablement backspace renvoie DEL (code 127), j'aimerais éviter de faire le #define DEL 127, quelle librairie dois-je inclure ?

    aussi quand je tape ctrl-d le programme ne quitte plus, comment faire pour que ctrl-d soit interpréter en mode raw.

    Autre question, en passant le terminal en mode raw (et donc en modifiant le fonctionnement de getchar (), je suis pas entrain de faire comme la fonction getch () de conio

    Merci

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On n'inclut pas une bibliothèque (library), on inclut un fichier d'en-tête.
    Il n'existe aucun fichier d'en-tête standard pour ce genre de choses. Regarde s'il y a des trucs dans termios.h, mais j'en doute: J'ai bien peur que tu doives utiliser des defines dépendant de la plate-forme...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par exhortae
    ....
    vraisemblablement backspace renvoie DEL (code 127), j'aimerais éviter de faire le #define DEL 127, quelle librairie dois-je inclure ?
    ...
    Par défaut les fonctions de stdlib/string renvoie le code ASCII 7 bits du caractère.

    Comme 8 est le code ASCII 7 bits de Backspace, tu l'auras. C'est juste qu'il n'aura pas de nom. Donc effectivement tu peux faire un define..

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    7 n'est pas BackSpace, 7 est BEL (Ctrl-G).
    8 est BackSpace (BS, Ctrl-H)

    Seulement, certains terminaux n'utilisent pas Backspace, mais DEL (127) pour signaler un retour arrière.
    Sur certains logiciels (comme PuTTY), c'est même configurable.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    oops c'est vrai...

    Corrigé

    [EDIT]

    Par contre, on peux toujours faire toascii(caractère) qui donnera bien 8...

    [/EDIT]

  8. #8
    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 exhortae
    voilà ce petit programme est censé remplacer le backspace \b saisi par \b, pourtant quand je teste ça ne marche pas
    K&R2 : Exercice 1-10.

    Il faut bien comprendre l'esprit de ces exercices du K&R2 qui sont un peu déroutant.

    Il s'agit du chapitre 1.5 : "Entrée / Sorties par caractères".

    Le but est d'utiliser les fonctions de base putchar() et getchar(), normalement prévues pour les flux stdout et stdin, d'une manière 'détournée' (en utilisant les redirections) de façon à traiter aussi des fichiers.

    Les redirections sont une manière particulière d'appeler le programme en précisant :

    • < la_source
    • > la_destination

    Par exemple le programme 1.5.1 'copie de fichier' fonctionne en réalité comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\> exo1_5_1 < fichier_source > fichier destination
    Idem avec l'exercice 1-10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\> exo1_10 < fichier_source
    Les données seront lues (entrée) dans le 'fichier_source', et écrites (sortie) à l'écran.

    Par contre, si tu appelles le programme comme ceci :
    les information seront lues à partir du clavier. Or dans ce cas, l'opérateur étant humain, le système autorise de faire des corrections (BS) avant de valider la saisie. Mais ces caractères de corrections n'apparaissent évidemment pas dans la chaine saisie finale (ce serait horrible .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entrer une phrase  : hello word<BS>ld<ENTER>
    qui donnerait :
    Absurde ! Ca donne évidemment
    Par contre, si la lecture se fait à partir d'un fichier, il est possible qu'il y ait des BS dedans et que ceux ci soient alors correctement affichés sous la forme '\b' par ton programme.

    Ton code est correct :

    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
     
    C:\dev\forums>dir *.exe
     Le volume dans le lecteur C s'appelle BOOT
     Le numéro de série du volume est 4C05-16D3
     
     Répertoire de C:\dev\forums
     
    15/06/2007  09:43           390 309 console.exe
                   1 fichier(s)          390 309 octets
                   0 Rép(s)   1 354 186 752 octets libres
     
    C:\dev\forums>console < test.txt
    hello word\bld
     
    C:\dev\forums>

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Emmanuel Delahaye

    Le but est d'utiliser les fonctions de base putchar() et getchar(), normalement prévues pour les flux stdout et stdin, d'une manière 'détournée' (en utilisant les indirections) de façon à traiter aussi des fichiers.

    Les indirections sont une manière particulière d'appeler le programme en précisant :

    • < la_source
    • > la_destination
    je pensait qu'on utilisait le terme indirection seulement pour des pointeurs, ça a avoir avec les pointeurs ici aussi??

    Citation Envoyé par Emmanuel Delahaye
    Par exemple le programme 1.5.1 'copie de fichier' fonctionne en réalité comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\> exo1_5_1 < fichier_source > fichier destination
    Idem avec l'exercice 1-10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\> exo1_10 < fichier_source
    Les données seront lues (entrée) dans le 'fichier_source', et écrites (sortie) à l'écran.
    OK j'ai testé et ça marche, mais je ne comprends pas ce principe d'indirection , visiblement ce ne sont pas des arguments à passer au programme (vu que j'ai int main (void), c'est implémenter dans le système d'exploitation ?? t'aurais pas un lien sous la main qui explique tout ça ?

    Merci

  10. #10
    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 exhortae
    je pensait qu'on utilisait le terme indirection seulement pour des pointeurs, ça a avoir avec les pointeurs ici aussi??
    Rien à voir. Ici, on est dans le contexte 'ligne de commande'. Mais en fait, je me suis trompé, c'est 'redirection'.
    OK j'ai testé et ça marche, mais je ne comprends pas ce principe d'indirection , visiblement ce ne sont pas des arguments à passer au programme (vu que j'ai int main (void), c'est implémenter dans le système d'exploitation ?? t'aurais pas un lien sous la main qui explique tout ça ?
    C'est dans la doc de ton système.

    http://www.linux.com/article.pl?sid=04/05/02/1758211

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Ok, merci à vous deux pour les réponses

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

Discussions similaires

  1. [vb.net] [design mode] le form n'apparait pas en mode design
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2005, 13h10
  2. ma popup n'apparait pas !
    Par zorba49 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 27/07/2005, 11h22
  3. [debutant] Window n'apparait pas!
    Par JulienDuSud dans le forum Windows
    Réponses: 20
    Dernier message: 01/12/2004, 17h17
  4. [Q] que faire quand un plugin n'apparait pas dans eclipse
    Par zolive dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/08/2004, 23h38
  5. Réponses: 4
    Dernier message: 15/01/2004, 22h53

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