ncurses nodelay用于响应箭头键反馈

时间:2015-02-25 21:52:26

标签: ncurses

我正在尝试使用ncurses和键盘箭头将整数写入文件。我使用nodelay,这样我就可以在没有任何内容的情况下向文件写入4。 ESC退出程序。问题是我所能写的所有文件都是4. ESC似乎工作正常,所以交换机正常工作。如果我取出nodelay,程序可以工作,但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();
     }
}

2 个答案:

答案 0 :(得分:0)

我能够通过在将4写入文件之前检查ch的最后一个值是否为ERR来解决此问题。不确定我完全理解......可能是时间问题。新计划:

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

答案 1 :(得分:0)

如果没有检查,您将忽略不是4行的行,因为几乎所有的返回值都是ERR&#39; s。此外 - 该程序将使用大量的CPU(什么都不做)。如果你使用timeout使用相当短的值(10-50毫秒)而不是nodelay,你会得到更好的结果。