Обновление и несколько консольных окон - PullRequest
0 голосов
/ 08 октября 2010

Я хочу написать простое консольное приложение на c ++ / c, чтобы показать мой процесс 1% 2%. сейчас я печатаю это построчно, как

finished 1%
finished 2%

и т. Д.

Как я могу просто обновить процент x% без печати новой строки?

Кроме того, я хочу открыть два окна консоли: одно сообщение с сообщением, одно - как показано выше. Как открыть другое окно консоли?

Ответы [ 4 ]

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

На большинстве всех терминалов вы можете напечатать возврат каретки ASCII '\ r' (значение 13 десятичное), чтобы вернуть курсор слева от текущей строки, что позволит вам перезаписать предыдущее значение.Или вы можете отправить пробелы ('\ b', ASCII 8), чтобы переместить один символ влево.Ни один из них не удалит автоматически отображаемый контент, но вы всегда можете перезаписать все, что вы больше не хотите видеть, в некоторых местах.В качестве альтернативы вы можете использовать управляющие коды, поддерживаемые вашей конкретной консолью (например, vt100, vt220 ...), которые, вероятно, будут иметь более продвинутые функции, такие как «до конца строки».Доступно множество библиотек для определения типа терминала и использования кодов, которые он поддерживает, или для синтеза сложных операций из множества более простых, где это необходимо: в Linux и UNIX библиотека ncurses является хорошим выбором.

C ++ не имеет понятия оконсольные окна.Открытие второго окна во многом зависит от используемой операционной системы и, возможно, от графической библиотеки, которую вы не указали.Однако в любой операционной системе ваше приложение может записывать некоторые сообщения в файл, а затем проверять этот файл из другого окна, которое вы открываете сами.В Linux / UNIX утилита "less" отлично подходит для проверки файлов журналов - помимо того, что она показывает вам содержимое в то время, когда вы запускаете less, вы можете попросить ее "следить" за новыми данными, когда они записываются в файл.

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

В окнах вы можете переместить курсор в любое место на экране, а затем начать печать оттуда:

COORD c;
c.X = x; c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

Конечно, вам нужно включить windows.h

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

Похоже, вы говорите о консольных приложениях Windows.

Каждый процесс Windows связан максимум с одним консольным окном.

Если вам нужно два консольных окна, вы можете запустить другоеобрабатывать и передавать на него выходные данные или связываться с ним через сокеты или «почтовые слоты» Windows или что-либо еще.

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

Вы можете обновить свое сообщение о прогрессе несколькими способами.Вы можете распечатать символы возврата, чтобы переместить курсор влево, а затем записать поверх старого вывода.Если ваша консоль поддерживает escape-последовательности ANSI, вы можете использовать escape-последовательность, чтобы зачеркнуть линию и заново нарисовать ее.

Наилучший метод, вероятно, будет зависеть от используемой консоли (разные консоли поддерживают разныевещи).Какую платформу вы используете и какую консоль?

...