Я написал небольшую программу на C ++, чтобы понять, как использовать \b
, Программа приведена ниже —
#include <iostream>
using namespace std;
int main(){
cout << "Hello World!" << "\b";
return 0;
}
Итак, эта программа дает желаемый результат Hello World
Это не должно происходить, потому что backspace только перемещает курсор назад на один пробел и не удаляет его из буфера. Так почему !
не печатается?
Теперь рассмотрим другую программу
#include <iostream>
using namespace std;
int main(){
cout << "Hello World!" << "\b";
cout << "\nAnother Line\n";
return 0;
}
Итак, здесь вывод —
Hello World!
Another Line
Почему backspace здесь не работает? Новая строка не должна очищать буфер, поэтому !
должны быть удалены. В чем здесь проблема?
Кроме того, когда я добавляю либо endl
или же \n
после \b
в обоих случаях вывод Hello World!
Но символ новой строки не очищает буфер, тогда как endl
очищает буфер. Итак, как вывод одинаков в обоих случаях?
Я предполагаю, что вывод из вашей первой программы выглядит примерно так?
$ ./hello
Hello World$
Если так, то !
не удаляется из буфера; оно засоряется, когда оболочка печатает подсказку.
Что касается второй программы, то когда буфер очищается, влияет только когда \b
отправляется в терминал, а не как это обрабатывается. \b
является частью потока, и терминал интерпретирует это как «резервное копирование одного столбца». Если это не ясно, посмотрите на фактические байты, отправленные стандартный вывод:
$ ./hello2 | hexdump -C
00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 21 08 0a 41 6e |Hello World!..An|
00000010 6f 74 68 65 72 20 4c 69 6e 65 0a |other Line.|
0000001b
\b
сопровождается \n
(08
а также 0a
соответственно) в соответствии с тем, что вы написали cout
в вашей программе.
В заключение, cout
сбрасывается при выходе из программы, поэтому не имеет значения, проходите ли вы \n
или же endl
в этом примере. По факту, \n
скорее всего, все равно промоет стандартный вывод подключен к терминалу.
Других решений пока нет …