如何将STDIN保持在C的终端底部

时间:2015-08-19 07:03:03

标签: c io terminal stdin instant-messaging

我正在c中编写一个简单的即时消息客户端。它目前运行良好,但是如果用户在键入时键入并收到消息,则消息显示在文本之后,然后用户继续在下面的行中。它看起来像这样:

  

USER:我正在努力......朋友:你好

     消息。 < ---(用户消息的结尾)

我的想法是:

以某种方式从stdin强制当前数据并将其加载到缓冲区中,然后在打印FRIEND之前使用\ r \ n:擦除行上的内容,然后从缓冲区打印。有没有人有任何具体的例子来说明如何完成这项任务?

最终结果应为

  

朋友:你好

     

USER:我正在尝试输入消息

用户开始输入消息,收到消息,stdin行向下移动,然后用户完成了他们的消息。

注意:我在最新版本的Linux Mint上运行GNOME Terminal 3.6.2

1 个答案:

答案 0 :(得分:1)

通常的方法是使用ncurses(任何类型的curses都可以使用),接受一个窗口中的输入并将结果写入另一个。这是一个简短的例子:

#include <curses.h>

int
main(void)
{
    bool done = FALSE;
    WINDOW *input, *output;
    char buffer[1024];

    initscr();
    cbreak();
    echo();
    input = newwin(1, COLS, LINES - 1, 0);
    output = newwin(LINES - 1, COLS, 0, 0);
    wmove(output, LINES - 2, 0);    /* start at the bottom */
    scrollok(output, TRUE);
    while (!done) {
    mvwprintw(input, 0, 0, "> ");
    if (wgetnstr(input, buffer, COLS - 4) != OK) {
        break;
    }
    werase(input);
    waddch(output, '\n');   /* result from wgetnstr has no newline */
    waddstr(output, buffer);
    wrefresh(output);
    done = (*buffer == 4);  /* quit on control-D */
    }
    endwin();
    return 0;
}

如果您想了解VT100控制代码(与ECMA-48不同),vt100.net有一些终端手册。

关于链接 VT100 control codes :这是错误信息的来源,如ncurses常见问题 How do I get color with VT100?

中所述