Переписать на месте - стандартный вывод - PullRequest
1 голос
/ 08 октября 2010

Поскольку я сейчас настраиваю новый сервер для использования, я использую много программ командной строки, таких как curl и wget, и я заметил, что они делают что-то интересное.При запуске в Терминале они печатают свой текущий прогресс на месте (например, 54% станут 55% на месте, вместо 55%, напечатанных на следующей строке - загрузите большой файл, и вы поймете, что я имею в виду).*

Мне было интересно, как программы могут это сделать.Запись в stdout не является чем-то новым для меня, но я озадачен тем, как что-то подобное будет работать.Я пытался писать в stdout, затем искать назад и писать снова;печать символов возврата ('\b') и печать новых вещей;и т.д., но, похоже, ничего не работает.

Нет ли API в Objective-C или C для этого?(C, например, имеет ungetc(), но не unputc()).Есть ли хаки, которые может достичь?
Просто кое-что интересное, о чем я хотел бы узнать больше ...

Спасибо!

Ответы [ 4 ]

5 голосов
/ 08 октября 2010

Наиболее распространенный метод - использование \r для возврата к началу строки и перезапись всей строки, но \b также должно работать. Убедитесь, что вы звоните fflush(stdout). И не позволяйте курсору перемещаться на другую строку, иначе перерисовка будет намного более болезненной.

3 голосов
/ 08 октября 2010

Вам также может быть интересен проект ncurses . Как только вы выйдете за рамки простых вещей, вы захотите сосредоточиться на логике вашего приложения, а не на его презентации!

GNU ncurses используется практически всеми симпатичными терминальными приложениями пользовательского интерфейса, с которыми вы сталкиваетесь.

2 голосов
/ 08 октября 2010

в основном вы можете сделать это примерно так:

printf( "progress %3d%%\r", perc );

\ r возвращается в начало той же строки

0 голосов
/ 08 октября 2010

Или S-Lang , который рассматривается многими как преемник ncurses .

...