这是我的main()代码:
#include <stdio.h>
#include <stdlib.h>
#ifdef __gnu_linux__
#include <ncurses.h>
#endif
#ifdef _WIN32
#include <curses.h>
#endif
#include "terminal_info.h"
#include "interface.h"
int main()
{
initscr();
setvbuf(stdout, NULL, _IONBF, 0);
testForUI();
readUIFile();
continuouslyUpdateInfo();
refresh();
printDocument();
getch();
endwin();
clearAll();
return 0;
}
我在printDocument()
:
void printDocument()
{
int counter = 0;
printw("Document Size: %d\n", documentSize);
for(counter = 0; counter < documentSize; counter++)
{
printw("%c",(char)document[counter]);
refresh();
}
}
在for循环开始时,gdb说文档的内容如下:
$1 = (uint8_t *) 0x3e32c0 "<Root>\r\n <Hello>World</Hello>\r\n <This>\r\n
<Is>:-)</Is>\r\n <An>:-O</An>\r\n <Example>:-D</Example>\r\n </This>\r\n</Root>\r\n««««««««_î_î_"
但程序只打印:
Document Size: 123
但是,如果我将printw语句更改为:
printw("%c - %d",(char)document[counter], document[counter]);
我明白了:
Document Size: 123
- 13
- 10 - 32 - 32 - 32 - 32< - 60H - 72e - 101l - 108l - 108o - 111> - 62W - 8
7o - 111r - 114l - 108d - 100< - 60/ - 47H - 72e - 101l - 108l - 108o - 111> - 6
- 13
- 13
- 10 - 9< - 60I - 73s - 115> - 62: - 58- - 45) - 41< - 60/ - 47I - 73s - 115
- 13
- 10 - 9< - 60A - 65n - 110> - 62: - 58- - 45O - 79< - 60/ - 47A - 65n - 110
- 13
- 10 - 9< - 60E - 69x - 120a - 97m - 109p - 112l - 108e - 101> - 62: - 58- -
- 13
- 13
- 13
- 10
我尝试使用setvbuf()在main()中禁用缓冲,但它根本没有给我任何好处。
以下是阅读和打印的文档,如果有帮助的话:
<Root>
<Hello>World</Hello>
<This>
<Is>:-)</Is>
<An>:-O</An>
<Example>:-D</Example>
</This>
</Root>
文件声明:extern uint8_t * document;
答案 0 :(得分:1)
你需要摆脱回车(CR)字符(\r
)。
输出CR时,ncurses会将光标重置为同一行中的第一列。然后,当您输出NL(\n
)时,ncurses会在将光标前进到下一行之前从光标位置擦除到行尾。这有效地删除了刚打印的整行。
记录了这种行为,因为它的价值。来自man waddch
(强调补充):
如果
ch
是制表符,换行符或退格键,则光标会在窗口中正确移动。退格键将光标向左移动一个字符;在窗口的左边缘它什么都不做。 换行执行clrtoeol
,然后将光标移动到下一行的窗口左边距,如果在最后一行则滚动窗口。标签被认为是每八列。可以通过设置TABSIZE
变量来更改选项卡间隔。
对于回车的回复记录在PORTABILITY部分末尾的ncurses waddch联机帮助页中:
如果
ch
是回车符,则光标移动到窗口当前行的开头。其他实现也是如此,但没有记录。
(感谢Thomas Dickey指出PORTABILITY部分。)