2015-02-25 3 views
0

Я пытаюсь записать целые числа в файл, используя ncurses и стрелки клавиатуры. Я использую nodelay, чтобы я мог записать 4 в файл, пока ничего не нажимается. ESC выходит из программы. Проблема в том, что все, что я могу записать в файлы, это 4. ESC, похоже, работает нормально, поэтому коммутатор работает. Если я выберу nodelay, программа работает, но 4 не могут быть записаны.ncurses nodelay для отзывчивой клавиши со стрелкой

Благодаря

#include <ncurses.h> 
#include <fstream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    ofstream outFile; 
    char outputFilename[80]; 
    sprintf(outputFilename, "files/file.%s",argv[1]); 
    outFile.open(outputFilename, ios::out); 
    int ch; 
    initscr(); 
    nodelay(stdscr,TRUE); 
    raw(); 
    keypad(stdscr, TRUE); 
    noecho(); 
    refresh(); 
    while(1){ 
     ch = getch(); 
     switch(ch) 
     { 
      case KEY_UP: 
       outFile << 0 << endl; 
       break; 
      case KEY_DOWN: 
       outFile << 1 << endl; 
       break; 
      case KEY_RIGHT: 
       outFile << 2 << endl; 
       break; 
      case KEY_LEFT: 
       outFile << 3 << endl; 
       break; 
      case ERR: 
       outFile << 4 << endl; 
       break; 
      case 27: 
       outFile.close(); 
       endwin(); 
       return 0; 
       break; 
      default: 
       break; 
     } 
     refresh(); 
    } 
} 

ответ

0

Я был в состоянии решить эту проблему, проверив, чтобы увидеть, если последнее значение ч было ERR перед записью 4 в файл. Не уверен, что я полностью понимаю ... может быть, вопрос времени. Новая программа:

#include <ncurses.h> 
#include <fstream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    ofstream outFile; 
    char outputFilename[80]; 
    sprintf(outputFilename, "interactive/taker.%s",argv[1]); 
    outFile.open(outputFilename, ios::out); 
    int ch; 
    int ch_prev=0; 
    initscr(); 
    nodelay(stdscr,TRUE); 
    raw(); 
    keypad(stdscr, TRUE); 
    noecho(); 
    while(1){ 
     ch = getch(); 
     switch(ch) 
     { 
      case KEY_UP: 
       outFile << 0 << endl; 
       break; 
      case KEY_DOWN: 
       outFile << 1 << endl; 
       break; 
      case KEY_RIGHT: 
       outFile << 2 << endl; 
       break; 
      case KEY_LEFT: 
       outFile << 3 << endl; 
       break; 
      case ERR: 
       if (ch_prev != ERR) 
       outFile << 4 << endl; 
       break; 
      case 27: 
       outFile.close(); 
       endwin(); 
       return 0; 
       break; 
      default: 
       break; 
     } 
     ch_prev=ch; 
     refresh(); 
    } 
} 
0

Без проверки вы будете игнорировать линии, которые не являются 4, так как почти все возвращаемые значения являются ERR. Также - программа будет использовать много CPU (ничего не делать). Вы получите лучшие результаты, если используете timeout с довольно коротким значением (10-50 миллисекунд), а не ноделей.

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