, Если вы хотите включить буферизацию, установите это значение обратно

устил программы командной строки, которые выводят строку, а затем обновляют ее через мгновение. Но с ruby ​​я могу только вывести строку, а затем другую строку.

Что у меня сейчас выводится:

Downloading file:
11MB 294K/s
12MB 307K/s
14MB 294K/s
15MB 301K/s
16MB 300K/s
Done!

И вместо этого я хочу увидеть это:

Downloading file:
11MB 294K/s

Затем последовал момент:

Downloading file:
16MB 300K/s
Done!

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

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

Ответы на вопрос(1)

Решение Вопроса

использование\r переместить курсор в начало строки. И вы не должны использоватьputs как добавляет\nиспользоватьprint вместо. Нравится:

print "11MB 294K/s"
print "\r"
print "12MB 307K/s"

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

По умолчанию, когда\n выводится на стандартный вывод, буфер очищается. Теперь вам может понадобитьсяSTDOUT.flush послеprint чтобы текст был напечатан сразу.

 Alex Wayne21 янв. 2011 г., 20:44
Это решение не показывает вывод, пока либо не будет выведен символ новой строки, либо программа не завершится. Этот пример, напримерprint '123';sleep 5; print "\r"; print "456" сначала ничего не печатает, а через 5 секунд печатает «456». Так что это не очень мне помогает.
 detunized21 янв. 2011 г., 20:46
ДобавлятьSTDOUT.flush немедленно отправить его на выход. Я также обновил ответ.
 Alex Wayne21 янв. 2011 г., 20:52
Аааа, это имеет смысл. Это исправлено и работает отлично, спасибо!
 the Tin Man21 янв. 2011 г., 21:09
«Это решение не показывает вывод, пока либо не будет выведен символ новой строки, либо программа не завершится». Это преднамеренное проектное решение в ОС для буферизации записи для более эффективного использования каналов ввода-вывода. Иногда нам нужно, чтобы данные были записаны немедленно, следовательно, мы можем вызвать сбросflush, Лучшее решение для такого приложения, как ваше, которое хочет, чтобы все STDOUT были записаны немедленно, - это использоватьSTDOUT.sync = true, Буферизация будет отключена для STDOUT, устраняя необходимость использованияflush, Если вы хотите включить буферизацию, установите это значение обратноfalse.

Ваш ответ на вопрос