C : Символы обратного пространства не отображаются в stdout?

#c #std

Вопрос:

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

Алгоритм, который я планирую реализовать, довольно прост. Если текущая команда содержит k символов, я вывожу k символов ‘b’, чтобы удалить k символов в текущей строке, а затем выведу выбранную команду в строку.

Тем не менее, я пытаюсь начать с чего-то простого, например, посмотреть, работает ли вывод символов «b » даже при удалении символов из текущей stdout строки:

 #include <iostream>
#include <queue>
#include <deque>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    cout << "asdf";
    cout << "bb" << endl;
    return 0;
}
 

Вывод приведенного выше фрагмента кода является:

 asdf
 

Когда я ожидаю:

 as
 

Важно: Я хочу удалить символы после того, как они будут выведены stdout .

Комментарии:

1. На большинстве терминалов backspace не стирает символы, он просто перемещает курсор на один пробел назад. Возможно, вам захочется вывести некоторые пробелы после b .

2. Например "bb b" (для каждого символа, который вы хотите стереть), Другой вариант-использовать экранирование ANSI и вернуть курсор вверх и очистить до конца строки.

Ответ №1:

Вам нужны коды эвакуации ANSI. Попробуй:

 #include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[]){
    cout << "asdf";
    cout<<"bbbb33[J";
    return 0;
}
 

33 расшифровывается ESC как и [J является параметром кода. ESC[J очищает экран от курсора до конца экрана. Для получения дополнительной информации: https://en.wikipedia.org/wiki/ANSI_escape_code#Fe_Escape_sequences

Как упоминалось в @n. 1.8e9-где моя доля, b просто перемещает курсор на один пробел назад и ничего не переписывает для большинства реализаций.

Ответ №2:

Я рекомендую использовать библиотеки ncurses и readline.

Пример:

 sudo apt-get install libncurses5-dev libncursesw5-dev libreadline-dev
git clone https://github.com/ulfalizer/readline-and-ncurses
cd readline-and-ncurses 
make
rlncurses
 

Мое окружение:

 lsb_release -d ; uname -r ; g   --version | head -1
Description:    Ubuntu 20.04.3 LTS
4.4.0-19041-Microsoft
g   (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0