Frage

Ich lerne in C zu programmieren und möchte in der Lage sein, Zeichen in das Terminal einzugeben, während mein Code ausgeführt wird, ohne zu drücken Rückkehr. Mein Programm funktioniert jedoch, wenn ich rufe initscr(), Der Bildschirm wird gelöscht - auch nach dem Anruf filter(). Die Dokumentation für filter schlägt vor, dass es das Löschen deaktivieren sollte - dies ist jedoch für mich nicht der Fall.

#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;
}

Warum löscht der obige Code den Bildschirm immer noch und was könnte getan werden, um ihn zu beheben?

Ich benutze Debian Lenny (stabil) und gnome-terminal, wenn das hilft.

War es hilfreich?

Lösung

Verwenden newterm() Anstatt von initscr(), dann sollte es dir gut gehen. Und vergiss nicht delscreen() Wenn Sie diesem Rat folgen.

Andere Tipps

Wenn Sie die Antwort von Mike.dld erweitern, funktioniert dies für mich auf MacOS X 10.6.6 (GCC 4.5.2) mit der System Cureses Library - ohne den Bildschirm zu löschen. Ich habe die Möglichkeit hinzugefügt, die getippten Zeichen (angemeldet an einer Datei "x") und die Fähigkeit zum Eingeben hinzu Kontrolle-d und stoppen Sie das Programm, anstatt den Benutzer zu unterbrechen.

#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;
}

Sie würden sehen, wie Ihr Bildschirm aus einem dieser Gründe in einer Flursanwendung gelöscht wird:

  • Ihr Programm ruft an initscr (was den Bildschirm löscht) oder newterm ohne zuerst anzurufen filter, oder
  • Die terminalische Initialisierung löscht den Bildschirm (oder es scheinen es zu löschen, indem er zum alternativen Bildschirm wechselt).

Im letzteren Fall können Sie die alternative Bildschirmfunktion in NCurses unterdrücken, indem Sie die zurücksetzen enter_ca_mode und exit_ca_mode Zeiger auf Null Wie in dialog. Wählen Sie besser eine Terminalbeschreibung, die das tut, was Sie wollen.

Weitere Lesung:

Grundsätzlich sind Flüche so konzipiert, dass sie den Bildschirm (oder das Fenster im Fall eines Fensteranschlusss) übernehmen. Sie können Flüche nicht wirklich mit Stdio mischen und können Flüche nicht wirklich verwenden, um etwas einzutreten oder auszugeben, ohne mit dem Rest des Bildschirms zu spielen. Es gibt Teilprobleme, aber Sie werden nie wirklich in der Lage sein, es so zu gestalten, wie es sich anhört, wie Sie es wollen. Es tut uns leid.

Ich würde vorschlagen, Ihr Programm entweder neu zu schreiben, um Flüche zu verwenden, oder um Alternativen wie Readline zu untersuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top