2015-10-28 2 views
0

Я только что переехал в Ubuntu, и я пытаюсь адаптироваться к проклятиям и ncurses. Я пытаюсь создать простой, который использует стрелки для навигации, использует Q для выхода и помощь с F2. Проблема в том, что после отображения текста справки, когда он возвращается в начальное меню, он печатает только исходные части mvprintw. Вот мой код:mvprintw() только частично печатается

КОД ОБНОВЛЕНО

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
#include <sys/stat.h> 
#include <locale.h> 
#include <ncurses.h> 

#define MIN 1 
#define MAX 6 

//STRUCT PARA ARMEZAR DADOS PARA CADASTRO 
typedef struct{ 
    char nome[50]; 
    long int rg; 
    char cpf[11]; 
    unsigned short idade; 
    float alt; 
}REGISTRO; 

REGISTRO dados; 

//Inicialização da função cadastro 
void cadastro(REGISTRO *dados); 

int main(){ 
    short c, opc, x, y; 

    char path[] = "data/"; 
    char pathA[] = "data/dados.bin"; 

    setlocale(LC_ALL, ""); 
    initscr(); 
    raw(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    FILE *data; 

    if(!mkdir(path, 0777)){ 
     printf("Pasta \"data\" nao encontrada.\nCriando diretório...\n"); 
    } 

    if((data = fopen(pathA, "r+"))==NULL){ 
     printf("Não foi possivel encontrar o arquivo dados.bin!\nUm novo arquivo será criado...\n"); 
     if((data = fopen(pathA, "w+"))==NULL){ 
      printf("Não foi possivel criar o arquivo.\nO programa será finalizado em breve!\n"); 
      exit(1); 
     } 
    } 

    do{ 
     erase(); 
     mvprintw(0,0,"-----DATABASE EVIL CORP-----\n"); 
     printw("1. Cadastro\n2. Whatever\n3. Whatever\n4. Whatever\n5. Whatever\n6. Whatever\n"); 
     x = 0; y = 1; opc = 1; 
     refresh(); 
     do{ 
      mvprintw(7,0,"OPC: %hd", opc); 
      mvprintw(8,0,"C: %hd", c); 
      move(y,x); 
      c = getch(); 

      if(c == 'Q' || c == 'q'){ 
       opc=0; 
       c=0; 
      } 

      if(c == KEY_F(2)){ 
       erase(); 
       mvprintw(0, 0, "MENU DE AJUDA"); 
       x = 0, y = 1, opc = 0; 
       refresh(); 
       getch(); 
      } 

      if(c == '\n'){ 
       switch(opc){ 
        case 1: 
         erase(); 
         cadastro(&dados); 
         getch(); 
         opc=0; 
        break; 

        case 2: 
         erase(); 
         printw("TESTE"); 
         getch(); 
         opc=0; 
        break; 

        default: 
         erase(); 
         mvprintw(0,0, "Opcao invalida ou ainda em construcao."); 
         getch(); 
         opc=0; 
        break; 
       } 
      } 

      switch(c){ 
       case KEY_UP: 
        if(opc>1){ 
         opc--; 
         y--; 
        } 

        else{ 
         opc=MAX; 
         y=MAX; 
        } 
       break; 

       case KEY_DOWN: 
        if(opc<6){ 
         opc++; 
         y++; 
        } 
        else{ 
         opc=MIN; 
         y=MIN; 
        } 
      } 

     }while(opc); 
    }while(c); 

    endwin(); 
    return 0; 
} 

void cadastro(REGISTRO *dados){ 
    erase(); 
    mvprintw(0, 0, "-----REGISTRO DE DADOS-----\nNome: "); 
    refresh(); 
    fgets(dados->nome, sizeof(dados->nome), stdin); 
    printw("RG: "); 
    scanf("%ld", &dados->rg); 
    fflush(stdin); 
    printw("CPF: "); 
    fgets(dados->cpf, sizeof(dados->cpf), stdin); 
    printw("Altura: "); 
    scanf("%f", &dados->alt); 
    printw("Idade: "); 
    scanf("%hd", &dados->idade); 
} 

Edited: Новая проблема, когда я иду в функции Cadastro(), я не могу видеть, что я делаю в качестве входных данных, но как-то Я знаю, что что-то происходит после нажатия случайных клавиш, я могу вернуться к первому меню, и все возвращается к норме. Я думаю, что это связано с экраном ncurses, но я не уверен в этом.

+0

Это отдельный вопрос: клавиши не эхо, потому что вы отключили эхо во время инициализации с помощью 'noecho();' –

+0

Да, я, наконец, исправил большую часть ошибки. Сначала я сменил fgets на getnstr, я еще не знаю, но у ncurses есть некоторые проблемы с stdin. И я просто активировал эхо в начале моей функции и снова выключил его в конце. Моя реальная проблема заключалась не в том, чтобы эхом, а в том, что fgets и scanf не работали так, как предполагалось. – GiovaniAbel

ответ

0

Проблема заключается в том, что программа запускает процесс оболочки «очистить», не делая endwin, чтобы сообщить ncurses о том, что он временно покидает экранный режим. Используйте функцию erase().

Если вы замените system("clear") на erase(), он будет вести себя так, как вы планировали.

+0

Спасибо, это действительно помогло с моей проблемой, но теперь у меня другая проблема, которую я не делаю, если это связано или нет с первым. Я думаю, что это что-то с экраном ncurses. Я обновляю первую тему, чтобы вы могли видеть, связано ли это. – GiovaniAbel

Смежные вопросы