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 :

Read non bloquant, repérer saisie backspace


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Par défaut Read non bloquant, repérer saisie backspace
    Bonjour

    J'ai placer mon term en mode non canonique et non echo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    old.c_lflag &= ~(ICANON|ECHO);
      old.c_cc[VMIN] = 1;
    J'ai donc coder cette fonction pour recuper un caractere ou une ligne entiere (tres pratique dans le programme que j'ai coder)

    Mon probleme est dans une partie de cette fonction jaimerais reperer la saisie du backspace car sans backspace. Sinon c'est trop rigide si on fait une erreur on doit recommencer l'operation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          do
            {
    	  lu += read(fd, &buf[lu], BUFF_MAX);
              buf[lu] = '\0';
              my_putstr(&buf[lu - 1]);
            }
          while (buf[lu - 1] != '\n');
          buf[lu - 1] = '\0';
    J'ai essayer avec ca (dans la boucle do while ci dessus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (buf[lu - 1] == 8)
    /*8 BS sous UNIX*/
    Mais non, je ne repere pas la saisie de la touche backspace

    Comment faire s'il vous plait ?

  2. #2
    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 firemax Voir le message
    J'ai placer mon term en mode non canonique et non echo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    old.c_lflag &= ~(ICANON|ECHO);
      old.c_cc[VMIN] = 1;
    J'ai donc coder cette fonction pour recuper un caractere ou une ligne entiere (tres pratique dans le programme que j'ai coder)

    Mon probleme est dans une partie de cette fonction jaimerais reperer la saisie du backspace car sans backspace. Sinon c'est trop rigide si on fait une erreur on doit recommencer l'operation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          do
            {
    	  lu += read(fd, &buf[lu], BUFF_MAX);
              buf[lu] = '\0';
              my_putstr(&buf[lu - 1]);
            }
          while (buf[lu - 1] != '\n');
          buf[lu - 1] = '\0';
    J'ai essayer avec ca (dans la boucle do while ci dessus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (buf[lu - 1] == 8)
    /*8 BS sous UNIX*/
    Mais non, je ne repere pas la saisie de la touche backspace

    Comment faire s'il vous plait ?
    C'est normal. Quand tu passes par le flux d'entrée standard (stdin, FILENO_STDIN en unixoide), le backspace est déjà géré par le système. Pourquoi tu veux faire ça ?

    Si tu y tiens, il faut utiliser les fonctions clavier de bas niveau : termios, *curses etc.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Par défaut
    Bah justement non c'est pas gerer dans mon programme :s

    Donc passer par la lib termios me derange pas

    Peux tu me donner une piste par ou chercher ?

    Sinon merci pour la reponse

    EDIT: J'ai trouver une piste ici, http://kiwi.emse.fr/POLE/SDA/tty.html je pense que je trouverais la solution dedans , a voir

    EDIT2 : La piste n'a rien donner, d'autre idee

  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
    Citation Envoyé par firemax Voir le message
    Bah justement non c'est pas gerer dans mon programme :s
    Ca, on sait. Je te dis que c'est géré par le système. Quand tu tapes BS, une correction est faite, le caractère est effacé...

    Si ça ne fonctionne plus en mode non bloquant (quelle idée...) revient au mode bloquant.

    Si le mode bloquant gène pour faire autre chose, apprends à utiliser select() ou les threads...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 48
    Par défaut
    Ah ok

    J'ai commencer a regarder pour select, mais je ne comprend pas bien son but ? En pratique ?

    http://www.linux-kheops.com/doc/man/.../select.2.html

    Je viens de lire plein de doc mais je me demande toujours comment ca peut m'aider a gerer le backspace (sachant que je suis en mode non canonique je sais pas si ca peut changer quelque chose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void    no_canonical_mode(struct termios old)
    {
      old.c_lflag &= ~(ICANON|ECHO);
      old.c_cc[VMIN] = 1;
      old.c_cc[VTIME] = 0;
      if (ioctl(0, TIOCSETA, &old) < 0)
        aff_error("ioctl");
    }

  6. #6
    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 firemax Voir le message

    J'ai commencer a regarder pour select, mais je ne comprend pas bien son but ? En pratique ?
    C'est une fonction bloquante qui se débloque sur 4 grands grands critères :
    • réception (flux entrant)
    • fin d'émission (flux sortant)
    • erreur (tous flux)
    • echéance de temps

    Les 3 premiers critères peuvent s'appliquer à plusieurs flux en même temps. Il est possible après déblocage, d'identifier la source de celui-ci et de faire le traitement adéquate.

    http://emmanuel-delahaye.developpez....aux.htm#select
    Je viens de lire plein de doc mais je me demande toujours comment ca peut m'aider a gerer le backspace (sachant que je suis en mode non canonique je sais pas si ca peut changer quelque chose.
    Tu es tétu... Le BS est déjà géré en interne par le système quand tu utulises une fonctions standard comme fgetc() ou fgets(). Il n'y a rien à gérer en plus. Il n'y a pas une ligne de code à ajouter pour ça.

Discussions similaires

  1. Socket - read non bloquant alors qu'il devrait être bloquant
    Par _LittleFlea_ dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 04/04/2011, 10h54
  2. lecture stdin non bloquante et temps de saisie
    Par TabrisLeFol dans le forum C
    Réponses: 10
    Dernier message: 29/11/2006, 16h46
  3. Rendre la lecture non bloquante
    Par Charlinecha dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 05/07/2005, 15h46
  4. Réponses: 3
    Dernier message: 16/03/2004, 16h42
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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