Pregunta

Estoy aprendiendo a programar en C y quiero poder escribir caracteres en el terminal mientras mi código se ejecuta sin presionar devolver. Mi programa funciona, sin embargo, cuando llamo initscr(), se borra la pantalla, incluso después de llamar filter(). La documentación para filter sugiere que debería deshabilitar la compensación, sin embargo, este no es el caso para mí.

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

¿Por qué el código anterior todavía borra la pantalla y qué se podría hacer para solucionarlo?

Estoy usando Debian Lenny (estable) y gnomo-terminal si eso ayuda.

¿Fue útil?

Solución

Usar newterm() en vez de initscr(), deberías estar bien entonces. Y no te olvides de delscreen() Si sigues este consejo.

Otros consejos

Extendiendo la respuesta de Mike.dld, esto funciona para mí en MacOS X 10.6.6 (GCC 4.5.2) con la biblioteca de Cursos del sistema, sin borrar la pantalla. Agregué la capacidad de grabar los caracteres escrito (registrado en un archivo "x") y la capacidad de escribir Control-d y detener el programa en lugar de obligar al usuario a interrumpir.

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

Verá su pantalla borraed en una aplicación de Maldiciones por una de estas razones:

  • Tu programa llama initscr (que borra la pantalla) o newterm sin la primera llamada filter, o
  • La inicialización del terminal borra la pantalla (o hace que parezca borrar, cambiando a la pantalla alternativa).

En el último caso, puede suprimir la función de pantalla alternativa en NCurses restableciendo el enter_ca_mode y exit_ca_mode consejos para nulo Como se hizo en dialog. Mejor aún, elija una descripción terminal que haga lo que desea.

Otras lecturas:

Básicamente, Curses está diseñado para hacerse cargo de la pantalla (o ventana, en el caso de una terminal con ventana). Realmente no puede mezclar maldiciones con STDIO, y realmente no puede usar maldiciones para simplemente ingresar o emitir algo sin meterse con el resto de la pantalla. Hay soluciones parciales, pero nunca podrás hacer que funcione de la manera que parece que quieres. Lo siento.

Sugeriría reescribir su programa para usar maldiciones en todo momento o investigar alternativas como Readline.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top