escaping — использование backspace с endl и \ n в переполнении стека

Я написал небольшую программу на 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 очищает буфер. Итак, как вывод одинаков в обоих случаях?

3

Решение

Я предполагаю, что вывод из вашей первой программы выглядит примерно так?

$ ./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 скорее всего, все равно промоет стандартный вывод подключен к терминалу.

-1

Другие решения

Других решений пока нет …