Partage
  • Partager sur Facebook
  • Partager sur Twitter

[stdin] pré-rempli

Sujet résolu
    18 avril 2022 à 13:35:48

    Bonjour,

    Dans un programme console (win), je propose à l'utilisateur d'entrer un nom de remplacement dans le cas de conflits.

    Mon souci est qu'il faut taper le nom complet et j'aimerais que stdin soit déjà rempli avec le nom d'origine afin que l'utilisateur n'ait qu'à corriger.

    Un peu comme lorsqu'on appuie sur la flèche du haut et que ça fait réapparaître la dernière commande.

    J'ai testé un truc aussi con que :

    void funcTester(void)
    {
        char in[20];
    
        fprintf(stdin, "hello world");
        gets(in);
        puts(in);
    
        return;
    }

    En me disant que des fois les choses sont moins complexes qu'elles n'y semblent... Mais non.

    J'ai testé ungetc() pour entrer toute la chaîne caractère par caractère, mais seul le premier caractère passe et n'est pas affiché.

    Pas plus de succès avec setvbuf...

    Une astuce ?

    Merci, salutations.

    • Partager sur Facebook
    • Partager sur Twitter

    Bonhomme !! | Jeu de plateforme : Prototype.

      18 avril 2022 à 15:45:44

      Ce n'est pas possible, ce qui est affiché dans le terminal que l'utilisateur saisit et ce qui est dans stdin sont deux choses distinctes. Si tu écris dans stdin ce ne sera pas visible dans la sortie standard, dans tous les cas ce que tu essayes de faire est tordu.

      En général quand on fait des questions interactives on propose des réponses vides par défaut par exemple avec l'installateur d'OpenBSD entre [] on indique les valeurs par défaut si l'utilisateur ne met rien :

      System hostname [something]:  
      Network interface [em0]: 

      Si tu veux vraiment faire quelque chose de très interactif avec édition du texte utilisateur il faudra passer probablement par du ncurses. Avis personnel : je préfère largement passer des arguments à un programme que répondre à des questions de manière interactive, c'est beaucoup plus facile à mettre en place.

      Exemple si on suggère un envoi de mail :

      echo "contenu du mail" | mail -s "Ceci est un test" francis@lalanne.com
      

      Autre note : gets est complètement insecure et supprimée depuis C11.

      -
      Edité par markand 18 avril 2022 à 15:47:15

      • Partager sur Facebook
      • Partager sur Twitter

      git is great because Linus did it, mercurial is better because he didn't.

        18 avril 2022 à 16:14:34

        Merci,

        markand a écrit:

        Avis personnel : je préfère largement passer des arguments à un programme que répondre à des questions de manière interactive[...]

        Sauf si l'utilisateur demande spécifiquement à être consulté...

        Mon programme se lance déjà avec tout un tas d'arguments possibles, mais l'un d'entre eux spécifie justement que l'utilisateur doit décider quoi faire lors des conflits.

        /** \brief Contains arguments for every command
         *\param -x (xtension) followed by strings of file extension to treat eg -x png zip.
         *\param -cs (clear case sensitive) followed by strings (exact) to remove from file name eg -cs toto : removes "toto" and keeps "ToTo". (overrides keep)
         *\param -c  (clear) followed by strings to remove from file name eg -c toto : removes "toto" and "ToTo". (overrides keep)
         *\param -ks (keep case sensitive) followed by strings (exact) to keep in file name eg -ks toto : keeps "(toto)" and removes "(ToTo)".
         *\param -k (keep) followed by strings to keep in file name eg -k toto : keeps "(toto)" and "(ToTO)".
         *\param -b (brackets) followed by list of opening brackets and closing brackets to remove with content eg -b ({ )}.
         *\param -p (prefix) Adds a prefix to all files
         *\param -s (suffix) Adds a suffix to all files
         *\param -f (folder) scan for sub-folders.
         *\param -r (remove) keeps first occurence, remove following on conflicts.
         *\param -u (unchange) name is unchanged on conflicts
         *\param -i (increment) increment is added (after suffix) on conflicts.
         *\param -d (decide) Asks user on conflicts (overrides -i -u -r).
         *\param -v (verbose) shows activity in console (slow).
         *\param -l (log file) creates log file (slow).
         *\param -man shows man.
        **/

        la commande -d entraîne un choix :

        puts("What do you want to do ?");
            puts("1 : Keep names unchanged this time, I'll manage it myself later.");
            puts("2 : Keep names unchanged now and then, stop bugging me !");
            puts("3 : Add increment for this time only.");
            puts("4 : Add increment now and then, stop bugging me !");
            puts("5 : Let me select which one I want to keep. OTHERS WILL BE REMOVED !");
            puts("6 : let me rename them myself.");


        Renommer manuellement le fichier est une des options, donc pas d'autre choix que de demander à l'utilisateur.

        Je sais pour gets(), mais je ne me donne pas la peine de sécuriser une fonction de test quand JE suis l'utilisateur. En postant j'étais certain que ça allait sortir et je me suis posé la question de préciser ou non qu'il ne fallait pas s'attarder là-dessus..

        Bon, si ce n'est possible de façon simple, tant pis pour la classe. Je ne ferai pas et c'est tout.

        Je ferme.

        Merci et bonne continuation.

        -
        Edité par drx 18 avril 2022 à 16:15:14

        • Partager sur Facebook
        • Partager sur Twitter

        Bonhomme !! | Jeu de plateforme : Prototype.

          18 avril 2022 à 16:17:44

          Bonjour,

          sinon à défaut des ncurses, il y a touours la gnu readline …

          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2022 à 16:32:21

            White Crow a écrit:

            Bonjour,

            sinon à défaut des ncurses, il y a touours la gnu readline …


            Merci, mais je suis en mode quick-dev, l'idée est de me faire un petit utilitaire sans y passer des plombes, c'est possible en lib standard ou non.

            Comme je ne maîtrise ni l'une ni l'autre, je vais me contenter de ne pas le faire, ça servira peut-être à d'autres au moins.

            • Partager sur Facebook
            • Partager sur Twitter

            Bonhomme !! | Jeu de plateforme : Prototype.

              19 avril 2022 à 15:53:45

              Salut drx,

              Pour faire une interface rapide, tu peux utiliser des outils de ligne de commande comme Dialog.

              C'est pratique sous Linux pour interagir avec une GUI/TUI à partir de scripts de ligne de commande (il y a aussi Zenity, YAD,...). Dialog est porté sous Windows :

              https://invisible-island.net/dialog/dialog.html
              http://andrear.altervista.org/home/cdialog.php

              Pour créer une boite de dialogue avec un champ input éditable demandant à l'utilisateur de changer le nom de fichier, tu envoies une commande  comme : dialog --inputbox "Change 'somefilename.ext' to what you like:" 8 40 "somefilename.ext"

              La commande ci-dessus donne ceci (sous Linux) :

              Une fois la boite validée, le résultat de la saisie est renvoyé sur stderr par défaut (ou avec l'option --stderr) ou sur stdout (ou avec l'option --stdout) que tu peux récupérer en les redirigeant vers un fichier ou avec popen ou l'API Win32. Le code de retour renvoyé par dialog indique quel bouton a été pressé.

              Edit : coquilles, ordre des explicationset précisions sur le code de retour

              -
              Edité par Dlks 20 avril 2022 à 13:29:29

              • Partager sur Facebook
              • Partager sur Twitter

              [stdin] pré-rempli

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown