我正在尝试使用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();
}
}
答案 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,你会得到更好的结果。