在下面的示例中,我接受一个假定为有效.txt文件的命令行arg,并将其输出到function.cpp中的屏幕。它读取和输出都很好 - 即使内容长于终端高度。但滚动不起作用,Ncurses文档要么不存在,要么很可怕 摘要:我可以运行下面的代码,但它只是打破了终端,我必须强行退出。
void printFile(char fileName[]) {
string line;
string cantOpen = "Unable to open file.";
int key;
ifstream file; //Stream to read from
file.open(fileName); //Specify file to open/read
initscr();
scrollok(stdscr, TRUE); //These lines are the ones I think are causing issues
idlok(stdscr, TRUE); //<<<
keypad(stdscr, TRUE); //<<<
if(file.is_open()) {
while(getline(file, line)) { //Read file and output it (working fine)
addstr(line.c_str());
addch('\n');
refresh();
}
file.close();
} else {
addstr(cantOpen.c_str()); //Inform user file wasn't opened
refresh();
}
key = getch();
if(key == KEY_SF) { //Scroll down
wscrl(stdscr, 1);
} else if(key == KEY_SR) { //Scroll up
wscrl(stdscr, -1);
} else if(key == KEY_ENTER) { //Enter to exit
endwin();
}
}
我尝试过的事情:
任何有关滚动操作的想法都无效,因为我在文档中看到了它?
答案 0 :(得分:3)
我认为你误解了这些惯例的目的。它们的设计目的不是为您提供比您更多的终端空间 - 它们只是在显示屏上移动文本的一种方式。
scrollok()
表示如果您尝试打印太多行进行输出,它将使用终端的滚动区域(硬件,如果可用,软件,如果需要)向上滚动区域,导致丢失数据在当前滚动区域的顶部。
wscrl()
的工作方式类似,导致滚动区域中的文字向上或向下滚动,导致数据丢失并用空格填充“新行”。
滚动后,必须将文字写入新区域。
希望这有帮助。