ncurses nodelay для отзывчивой обратной связи со стрелками

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

Спасибо

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

person user1971455    schedule 25.02.2015    source источник


Ответы (2)


Я смог решить эту проблему, проверив, было ли последнее значение ch 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();
     }
}
person user1971455    schedule 25.02.2015

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

person Thomas Dickey    schedule 01.03.2015