Ncurses 不滚动 stdscr,导致终端行为异常
Ncurses not scrolling stdscr, causing abnormal terminal behavior
在下面的示例中,我采用一个假定为有效.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 的任何示例,这些示例不仅链接回文档
任何想法为什么滚动不像我在文档中看到的那样工作?
我认为您误解了这些例程的目的。它们不是为了给你比你更多的终端空间而设计的——它们只是一种在显示屏上移动文本的方式。
scrollok()
意味着,如果您尝试打印太多行以输出,它将使用终端的滚动区域(硬件,如果可用,软件,如有必要)向上滚动该区域,从而导致当前滚动区域顶部的数据丢失。
wscrl()
的工作方式类似,导致滚动区域中的文本向上或向下滚动,导致数据丢失并用空白填充"新行"。
滚动后,必须将文本写入新区域。
希望这有帮助。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 终端不会为C++文件创建.exe文件吗
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 终端(bash)如何知道引发了什么异常
- Ncurses 不滚动 stdscr,导致终端行为异常