Хочу сделать вывод в виде progress bar: [+++++++++ ] X/y Вопрос как сделать такую форму? Меня интересует самый оптимальный алгоритм реализумый средствами стандартного си без использования множества символов '\b' чтобы не перегружать видео и проц. Спасибо.
Не понимаю, чем не устраивает вариант с '\r' ? Я когда-то так делал. С чего ты взял, что это загружает проц? (Возможно это из-за того, что ты слишком часто вызывать ф-цию рисования этого прогресса. Имхо, в большинстве случаев достаточно с точностью до процента, т.е. всего будет вызвано 100 раз, в этом случае можно даже ограничится целочисленной арифметикой).
NoName Код (Text): #include <stdio.h> void progress(int x) { int i, y = x/2; printf("\r["); for (i = 0; i < 50; ++i) putc(i < y ? '+' : ' ', stdout); printf("] %u%%",x); } int main(void) { int i; for (i = 1; i <= 100; sleep(50), ++i) /* sleep() не в стандарте, это просто для наглядности */ progress(i); return 0; }
мой вариант, на C99: Код (Text): #include <stdio.h> int posX = 1; int posY = 1; int width = 10; char empty[] = " "; void drawBar(int value) { int i; _gotoxy(posX, posY); putchar('['); printf(empty); putchar(']'); if(!value)return; _gotoxy(posX+1, posY); for (i = 0; i < value; i++) putchar('+'); } int main(void) { int i = 0; do { _sleep(1); drawBar(i); }while (i++ < width); getchar(); return 0; }
osrootd ncurses: Future Plans Extended-level XPG4 conformance, with internationalization support. Ports to more systems, including DOS and Windows. А NoName сейчас под DOS потребовалось ))
Arthur это расширение, в С99 нет такого. А вообще, стандарт - это ISO 9899:1999, а не хелп от PellesC (к тому же у всяких _sleep() там написано красным цветом: "[Not standard C]"). osrootd библиотека полезная, но для простых целей типа прогрессбара лучше обойтись стандартными средствами. Не надо стрелять по мухе из базуки.