Ncurses不滚动stdscr,导致异常终端行为

时间:2016-07-06 20:30:42

标签: c++ c++11 scroll terminal ncurses

在下面的示例中,我接受一个假定为有效.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();
  }
}  

我尝试过的事情:

  • 使用scrl(stdscr,x)代替wscrl(...)
  • 不检查要执行向上或向下或退出的特定击键
  • 尝试找到滚动stdscr的任何示例,这些示例不仅仅链接回文档

任何有关滚动操作的想法都无效,因为我在文档中看到了它?

1 个答案:

答案 0 :(得分:3)

我认为你误解了这些惯例的目的。它们的设计目的不是为您提供比您更多的终端空间 - 它们只是在显示屏上移动文本的一种方式。

scrollok()表示如果您尝试打印太多行进行输出,它将使用终端的滚动区域(硬件,如果可用,软件,如果需要)向上滚动区域,导致丢失数据在当前滚动区域的顶部

wscrl()的工作方式类似,导致滚动区域中的文字向上或向下滚动,导致数据丢失并用空格填充“新行”。

滚动后,必须将文字写入新区域。

希望这有帮助。