Question

J'apprends à programmer en C et que vous voulez être en mesure de saisir des caractères dans le terminal alors que mon code est en cours d'exécution sans appuyer sur retour . Mes travaux de programme, mais quand je l'appelle initscr(), l'écran est effacé - même après avoir appelé filter(). La documentation de filter suggère qu'il devrait désactiver compensation -. Mais ce n'est pas le cas pour moi

#include <stdio.h>
#include <curses.h>
#include <term.h>

int main(void) {

    int ch;

    filter();
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    while((ch = getch()) != EOF);

    endwin();

    return 0;
}

Pourquoi le code ci-dessus clearr encore l'écran, et ce qui pourrait être fait pour y remédier?

J'utilise Debian Lenny (de stable) et gnome-terminal si cela aide.

Était-ce utile?

La solution

Utiliser newterm() au lieu de initscr(), vous devriez être bien alors. Et ne pas oublier delscreen() si vous suivez ces conseils.

Autres conseils

L'extension de la réponse par mike.dld, cela fonctionne pour moi sur Mac OS X 10.6.6 (GCC 4.5.2) avec le système maudit bibliothèque - sans effacer l'écran. J'ai ajouté la possibilité d'enregistrer les caractères tapés (connecté à un fichier « x »), et la capacité à taper CONTROL-D et arrêter le programme plutôt que de forcer l'utilisateur à interrompre.

#include <stdio.h>
#include <curses.h>
#include <term.h>

#define CONTROL(x)  ((x) & 0x1F)

int main(void)
{
    FILE *fp = fopen("x", "w");
    if (fp == 0)
        return(-1);
    SCREEN *s = newterm(NULL, stdin, stdout);
    if (s == 0)
        return(-1);
    cbreak();
    noecho();
    keypad(stdscr, TRUE);

    int ch;
    while ((ch = getch()) != EOF && ch != CONTROL('d'))
        fprintf(fp, "%d\n", ch);

    endwin();

    return 0;
}

Vous verriez votre écran effacé dans une application de malédictions pour une des raisons suivantes:

  • votre programme appelle initscr (qui efface la écran) ou newterm sans appeler filter ou
  • l'initialisation terminal efface l'écran (ou fait apparaître pour effacer, en passant à l'écran alternatif).

Dans ce dernier cas, vous pouvez supprimer la fonction de l'écran de remplacement dans ncurses en remettant à zéro les pointeurs enter_ca_mode et exit_ca_mode à NULL comme cela se fait dans dialog. Mieux encore, choisissez une description terminal qui fait ce que vous voulez.

Pour en savoir plus:

Fondamentalement, sorts est conçu pour prendre en charge l'écran (ou d'une fenêtre, dans le cas d'un terminal fenêtré). Vous ne pouvez pas vraiment mélanger malédictions avec stdio, et vous ne pouvez pas vraiment utiliser malédictions pour entrer ou juste quelque chose de sortie sans déconner avec le reste de l'écran. Il y a des solutions de contournement partielles, mais vous ne réussirez jamais vraiment être en mesure de faire fonctionner la façon dont il semble que vous voulez. Désolé.

Je vous suggère de réécrire soit votre programme malédictions d'utilisation tout au long, ou d'enquêter sur des alternatives comme readline.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top