Как сделать так, чтобы вывод повторялся в одной вертикальной линии? - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь, чтобы вход игрока непрерывно печатался по вертикальной линии каждый раз, когда вводится новый ввод. По какой-то причине это выводит пробел размером всего ввода каждый раз, когда вводится новое значение. Я понятия не имею, почему это происходит, так как я считаю, что код никогда не говорит ему добавить такой пробел.

Я пытался заменить позицию курсора и обновлять страницу каждый раз, но это не сработало. Я искал решения, но не нашел ни одного. Я использую библиотеку ncurses и в этот момент мне кажется, что я что-то упускаю.

#include <iostream>
using namespace std;
#include <ncurses.h>

void initialize()
{
    initscr();
    clear();
    cbreak();
    noecho();
}

int main()
{

    initialize();

    char input;
    bool turn = true;
    short int x, y = 0;

    while (turn) {
        ;
        input = getch();
        ;
        cout << "You entered: " << input << std::endl;
    }

    return 0;
}

Это вывод:

                                                            You entered: d
                                                                          You entered: j
        You entered: w
                      You entered: i
                                    You entered: d
                                                  You entered: j
                                                                You entered: a
                                                                              You entered: i
            You entered: w
                          You entered: j
                                        You entered: a
                                                      You entered: d
                                                                    You entered: i
  You entered: w
                You entered: j
                              You entered: d
                                            You entered: i
                                                          You entered: d
                                                                        You entered: d

Это должно быть:

You entered: d
You entered: d
You entered: d
You entered: d
You entered: d
You entered: d
You entered: d

1 Ответ

0 голосов
/ 05 марта 2020

Смешивание cout и curses не работает должным образом, поскольку последний инициализирует терминал в режиме raw и имитирует raw или cooked ( например, режим cbreak). cout ничего об этом не знает и исходит из предположения, что вывод «приготовлен» (т. Е. Перевод строки переводится в возврат каретки и перевод строки).

Это связаны (но не совсем совпадают) с nl и nonl (опять же, curses имитирует вещи).

Если у вас действительно есть , чтобы смешать два вам придется заканчивать каждую строку \r\n и делать сбросы, чтобы убедиться, что вывод завершен. Но так как вывод с использованием cout также путает проклятия о том, где находится курсор (проклятия помещают текст в неправильном месте на экране), вам нужно сделать это только временно, для отладки программы.

...