Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.65/20: Рейтинг темы: голосов - 20, средняя оценка - 4.65
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
1

Простейшая индикация выполнения в консоли.

09.09.2011, 11:01. Просмотров 3593. Ответов 23
Метки нет (Все метки)

Привет всем форумчанам!

Пишу небольшую консольную утилитку.
В конце отладки выяснилось что трудно догадаться чем в данный момент занимается утилита.

Встал вопрос реализации некой анимации - индикатора выполнения. Например крутящийся "/".

Как это лучше реализовать?

Заранее спасибо!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2011, 11:01
Ответы с готовыми решениями:

Задержать закрытие окна консоли после выполнения программы
Какой командой задержать экран C++ после выполнения программы, а то он сразу...

Как сделать чтобы программа не вылетала после однократного выполнения в консоли
Доброго времени суток! Подскажите пожалуйста,можно ли сделать так чтобы...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать...

считывание с консоли ( не с клавы, а именно с консоли)
нужно написать функцию которая возвращает string в котором написано 500...

C++ простейшая программа
Пару дней, как начал учить с++ и вот как бы первая проблема: #include...

23
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 11:20 2
Перемещать курсор в заданную позицию и выводить последовательно символы \ | / -
Как переводить курсор зависит от используемой IDE и библиотек. В соседних темах поищи.
0
xAtom
918 / 743 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
09.09.2011, 11:22 3
Вот.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
 
int  main(void) {
 
    HANDLE hout     = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dw        = 0u;
    char  cadr[]    = "-\\|/"; 
    const char* ptr;
 
    COORD pos = { 10, 10 }; // позиция вывода анимации
    while(1) {
            for(ptr = cadr; *ptr != '\0'; *ptr++) {
                   FillConsoleOutputCharacter(hout, *ptr, 1u, pos, &dw);
                   Sleep(200u);
            }
    }
    return 0;
}
0
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 11:42  [ТС] 4
Как переводить курсор зависит от используемой IDE и библиотек. В соседних темах поищи.
VS2008. ну и есс-на iostream и windows.h. В темах с основном пишут про мышиный курсор.


Код
COORD pos = { 10, 10 }; // позиция вывода анимации
А как узнать предыдущую позицию курсора?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 11:53 5
Цитата Сообщение от NWR Посмотреть сообщение
как узнать предыдущую позицию курсора?
GetConsoleScreenBufferInfo

И прочее
http://msdn.microsoft.com/en-us/library/ms682073%28v=vs.85%29.aspx
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
09.09.2011, 12:01 6
Цитата Сообщение от Deviaphan Посмотреть сообщение
Как переводить курсор зависит от используемой IDE и библиотек.
C++
1
cout << '\b';
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:13 7
Это удалит последний введённый символ.
А если изменить нужно первый символ или в середине? Тогда уж проще вообще всё перепечатать.)

Добавлено через 2 минуты
Цитата Сообщение от NWR Посмотреть сообщение
В конце отладки выяснилось что трудно догадаться чем в данный момент занимается утилита.
Может, лучше выводить проценты или даже текстовые описания текущих действий?
Простой \|/- не сделает понятнее. Будет лишь ясно, что не подвисла программа.
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
09.09.2011, 12:20 8
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это удалит последний введённый символ.
Это переместит курсор на один символ назад.
0
fasked
Эксперт С++
4982 / 2561 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.09.2011, 12:23 9
Лучший ответ Сообщение было отмечено как решение

Решение

Опаньки http://www.boost.org/doc/libs/1_41_0/libs/timer/timer.htm
6
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:26 10
Класс! Не знал про таймер.) Надо получше в бусте покопаться, ещё вкусняшек поискать.)
0
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 15:42  [ТС] 11
GetConsoleScreenBufferInfo
О! Попробую. Спассибо!

Может, лучше выводить проценты или даже текстовые описания текущих действий?
Простой \|/- не сделает понятнее. Будет лишь ясно, что не подвисла программа.
Тогда заодно перед крутилкой еще и какую нибудь тектовуху буду выводить. Теперь во всеорудии))

Добавлено через 2 часа 27 минут
UPD.

Возникла неожиданная проблема в самом конце. не связано с выводом на экран, но чтобы не плодить темы спрошу здесь.

Почему метод close из fstream вызывает исключение?

у меня вызывается несколько файлов. и при закрытии одного из них происходит вылет с исклюением.
код типа этого
Код
ifstream Myfile ("file.type");
...
...
...
Работа с файлом
...
...
..
Myfile.close();
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 15:48 12
Файл не был открыт. Был закрыт до этого. Была ошибка в процессе чтения. Мало ли что.
Если у тебя не допотопный компилятор, то может и не быть потребности в явном вызове close(), но в нормальных условиях должно было нормально закрыться поток.
1
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
09.09.2011, 16:26  [ТС] 13
Если у тебя не допотопный компилятор, то может и не быть потребности в явном вызове close(),
конкретно для этого файла я close и не вызывал.
Однако в конце всех манипуляций мне нужно удалить этот файл.
А DeleteFile не удаляет, возвращает NULL.Вот я и решил что нужно б закрыть для начала. И все, приехал.


А в процессе работы я его всего лишь считываю посимвольно (get) до самого конца и все.

Добавлено через 33 минуты
Нет, я все равно не вкурю.

Код
		loop_reading: //начало цикла чтения файла

		cout << progress_symbol[pos];
		cout << '\b';
		
		if(++wait_to_change > 10)
		{
			wait_to_change = 0;
			if(++pos > 3)
				pos = 0;		
		}
		
		int symb_position;
		symb_position = 0;
		
		ifstream DataLog("DATA.log");

		if(!DataLog)
		{
			goto loop_reading;
		}
		
		
		cond_file_size = 0;
		
		for(;!DataLog.eof();)
		{
			str1[symb_position] = DataLog.get();
			
			cond_file_size++;
			
			if(++symb_position >= sizeof(str1))
			{
				for(int s = 0; s < (sizeof(str1) - 1); s++)
				   str1[s] = str1[s+1];
				
			 symb_position--;
			}
		}
		
		DataLog.close();
...
Вот чему здесь уходить в exception?..
0
talis
793 / 545 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 17:02 14
Цитата Сообщение от Deviaphan Посмотреть сообщение
Если у тебя не допотопный компилятор
Deviaphan, а разве от компилятора это зависит?

NWR, код, который выбрасывает исключение, окружите блоком try ... catch(), поймайте нужное вам исключение. У всех объектов исключения STL есть функция what(), которая возвращает char* на строку с объяснением ошибки.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 17:05 15
Цитата Сообщение от talis Посмотреть сообщение
а разве от компилятора это зависит?
Как выяснилось в соседней теме, Borland C++ for DOS не закрывает поток в деструкторе.
0
easybudda
Модератор
Эксперт CЭксперт С++
10119 / 6026 / 1511
Регистрация: 25.07.2009
Сообщений: 11,418
09.09.2011, 17:55 16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <unistd.h>
 
int main(void){
    const char buf[] = "-\\|/";
    int percents;
    
    for ( percents = 0; percents < 100; ++percents ){
        printf("%c %02d%%", buf[percents % 4], percents);
        fflush(stdout);
        usleep(500000);
        printf("\b\b\b\b\b");
    }
    printf("Done.\n");
    
    return 0;
}
Ну, соответственно, вместо unistd.h - windows.h, вместо usleep() - Sleep()...


Цитата Сообщение от NWR Посмотреть сообщение
C++
1
for(;!DataLog.eof();)
А файл читается правильно?
1
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
10.09.2011, 03:13 17
Цитата Сообщение от NWR Посмотреть сообщение
Вот чему здесь уходить в exception?..
А точно его вызывает close?

Цитата Сообщение от NWR Посмотреть сообщение
C++
1
2
3
4
if(!DataLog)
 {
    goto loop_reading;
 }
Жесть... файл не может открыться по какой-либо причине, допустим отсутствие такового на диске, в результате с такой конструкцией получим вечный цикл, но зато с анимацией бурной деятельности
0
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
10.09.2011, 08:55  [ТС] 18
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <unistd.h>
 
int main(void){
    const char buf[] = "-\\|/";
    int percents;
    
    for ( percents = 0; percents < 100; ++percents ){
        printf("%c %02d%%", buf[percents % 4], percents);
        fflush(stdout);
        usleep(500000);
        printf("\b\b\b\b\b");
    }
    printf("Done.\n");
    
    return 0;
}
Ну, соответственно, вместо unistd.h - windows.h, вместо usleep() - Sleep()...



А файл читается правильно?
Индикация выполнения отрабатывает. С этим проблем нет. И файл читается на удивление правильно.

А точно его вызывает close?
Catchить пока не пробовал. Просто если закоментраить закрытие то нет и исключения.

Жесть... файл не может открыться по какой-либо причине, допустим отсутствие такового на диске, в результате с такой конструкцией получим вечный цикл, но зато с анимацией бурной деятельности
))) Не не не. Файл все равно так или иначе там появится)
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
10.09.2011, 09:05 19
Цитата Сообщение от NWR Посмотреть сообщение
Не не не. Файл все равно так или иначе там появится)
отсутствие файла на диске это одна из многих причин. В любом случае эта часть кода бессмысленна.
0
NWR
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 11
10.09.2011, 09:39  [ТС] 20
отсутствие файла на диске это одна из многих причин. В любом случае эта часть кода бессмысленна.
Просто в нормальных условиях файл появится в папке раньше чем откроется поток. Если вдруг не успел, то нужно дождаться....


Мля. Оказалось что после чтения, исключение способны вызвать еще и clear и seekg(0,ios::beg). Что за грабли такие...Пошел делать catch...
0
10.09.2011, 09:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 09:39

Простейшая задача
Прошу помощи сижу на экзамене последний вопрос Какое значение будет присвоено...

Простейшая структура
Описать структуру с именем STUDENT содержащую следующие поля: фамилия и...

Простейшая авторизация в программе
нужно разработать программу, которая вводит имя пользователя, затем вводит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru