2013-06-01 5 views
2

Я пытаюсь анимировать панель загрузки.Выходной символ возврата в UNIX

Он работает полностью нормально в Windows, выполнив следующие действия:

for(int j=0; j<currentSize; ++j) 
     cout<<static_cast<char>(219); 
    for(int k=maxSize; k>=currentSize; k--) 
     cout<<static_cast<char>(177); 
    ... 
    for(int l = 0; l<maxBarSize; l++){ 
     cout<<'\b'; 

Когда я пытаюсь в UNIX, однако, команда забой не работает. Он ничего не удаляет и не печатает. Я также пробовал использовать '^H', начиная с '\b'.

Невозможно стереть выходную консольную линию в UNIX?

+4

попробуйте 'cout.flush()'. вы можете использовать '' \ r''. обратите внимание, что backspace ничего не очищает - только перемещает курсор назад. – Elazar

+0

Это сделал трюк, спасибо! –

ответ

3

Вы пробовали печать [backspace], [space], [backspace]? Это напечатает пробел поверх символа, который вы пытаетесь стереть.

Если это не работает, я подозреваю, что проблема кроется не в вашем коде, а в эмуляторе терминала (xterm и т. Д.) Некоторые поддерживают такие вещи, как backspace, некоторые - нет (и некоторые из них настраиваются) ,

Aso, Elazar сделал comment о вызове cout.flush(). Это происходит потому, что большую часть времени, stdout is line-buffered. Это означает, что библиотеки будут буферизовать все данные, записанные в stdout, до тех пор, пока не встретится новая строка, после чего буфер будет сброшен в фактический дескриптор файла. Вызывая flush(), вы принудительно записываете выходной буфер в файл (TTY).

3

Печать \b или ^h делает именно это: он «распечатает» эти символы. Он не выполняет операцию «обратного удаления», что будет делать программа TTY в ответ на это как входы клавиатуры. Вы не видите их в выходе, потому что они не являются видимыми символами. Они меняют положение курсора. Если вы напечатали:

Hello, World!\b\b\b\b\b\bEarth! 

Вы увидите все эти символы, если вы отправите вывод в файл. Но на терминале это может выглядеть так:

Hello, Earth! 

«Мир!» персонажи все еще там, просто перезаписаны «Землей!».