Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> красивый вывод в консоль 
V
    Опции темы
cupper
Дата 15.3.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Нужно распечатать в консоль список данных. По определенным параметрам та или иная строка данных должна быть окрашена определенным цветом.

В установкой цвета уже разобрался. Не могу разобраться вот с чем: строка консоли в данной задачи это вся область (высотой в одну буку) от левого до правого края консоли. Это необходимо для того что бы цветные строки выглядели красиво, а не так: одна длинней другой.

Проблема в том как определить число символов которой может быть напечатано в строке консоли, что бы сделать правильное выравнивание с помощью setw. 

В винде оно может и без этих вые*онов работает, а вот в лине
Код

cout << "\033[42m\033[1;37m" << "a\t text \ta" << "x" << "\033[0m" << endl;

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

И это нужно сделать и для win и для linux.
Подскажите.
PM MAIL   Вверх
bsa
Дата 17.3.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



стаднартного метода нет.
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
PM   Вверх
cupper
Дата 18.3.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Сделал так
Код

#ifdef _LINUX
#    include <sys/ioctl.h>
#    include <stdio.h>
#else
#    include <windows.h>
#endif // LINUX
#ifdef _LINUX
            winsize ws;
            if (ioctl(STDOUT_FILENO,TIOCGWINSZ,&ws)!=0)
                width = 80;
            else
                width = ws.ws_col;
#else
            CONSOLE_SCREEN_BUFFER_INFO console_scr_buf_Info;
            HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
            GetConsoleScreenBufferInfo(hStdout, &console_scr_buf_Info);
            width = console_scr_buf_Info.dwSize.X;
#endif

правда под линь пока не успел проверить. 

Так же не большой код для такпо форматированному выводу (плсю цветной текст)
Код

        void show_life_host(std::ostream& os, const Host_info_sptr& host, boost::uint16_t width, boost::uint16_t dname_max_len, boost::uint16_t market_max_len, boost::uint16_t path_max_len)
        {
#ifdef _LINUX
            os << "\033[42m\033[1;31m";
            show_host_info(os, host, width, dname_max_len, market_max_len, path_max_len);
            os << "\033[0m";
#else
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            GetConsoleScreenBufferInfo (GetStdHandle(STD_OUTPUT_HANDLE), & csbi);
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_GREEN |FOREGROUND_RED);

            show_host_info(os, host, width, dname_max_len, market_max_len, path_max_len);

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), csbi.wAttributes);
#endif //_LINUX
        }

        void show_host_info(std::ostream& os, const Host_info_sptr& host, boost::uint16_t width, boost::uint16_t dname_max_len, boost::uint16_t market_max_len, boost::uint16_t path_max_len)
        {
            
            os    << std::setw(20) << std::left << host->ip()
                << std::setw(dname_max_len + 5) << std::left << host->name()
                << std::setw(market_max_len + 5) << std::left << host->market();

            boost::uint16_t total_length = 20 + (dname_max_len + 5) + (market_max_len + 5) + (path_max_len + 5);

            if(total_length > width)
                os << std::endl << std::setw(width) << std::right << host->path() << std::left;
            else
                os << std::setw(path_max_len + (width - total_length) + 5) << std::left << host->path();
        }

PM MAIL   Вверх
cupper
Дата 29.3.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



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

Сейчас я делаю так, перед выводом новой таблицы отчищая консоль и вывожу ее по новой
Код

#ifdef _LINUX
            system("clear");
#else
            system("cls");
#endif //_LINUX


но сильно заметно как консоль мерцает. Как можно избежать этого мерцания ?
PM MAIL   Вверх
Alca
Дата 29.3.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Может так? Не факт:

Код

#ifdef _LINUX
    //system("clear");
    const string HOME_CURSOR  = "\033[0;0H"; // Place the cursor at 0;0 position.
    const string CLEAR_SCREEN = "\033[2J";
    cout << CLEAR_SCREEN << HOME_CURSOR;
#else
    system("cls");
#endif //_LINUX


Добавлено @ 15:23
http://lifeforce4.wordpress.com/

Это сообщение отредактировал(а) Alca - 29.3.2011, 15:23


--------------------
PM WWW ICQ Skype Jabber   Вверх
bsa
Дата 29.3.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



cupper, а не надо очищать консоль. Надо просто полностью перерисовать экран. В т.ч. и пустые места.
PM   Вверх
cupper
Дата 29.3.2011, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(bsa @ 29.3.2011,  15:47)
cupper, а не надо очищать консоль. Надо просто полностью перерисовать экран. В т.ч. и пустые места.

если вы намекнете как это сделать вы возможно спасете меня от создание GUI smile
PM MAIL   Вверх
cupper
Дата 29.3.2011, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(Alca @ 29.3.2011,  15:23)
Может так? Не факт:

Код

#ifdef _LINUX
    //system("clear");
    const string HOME_CURSOR  = "\033[0;0H"; // Place the cursor at 0;0 position.
    const string CLEAR_SCREEN = "\033[2J";
    cout << CLEAR_SCREEN << HOME_CURSOR;
#else
    system("cls");
#endif //_LINUX


Добавлено @ 15:23
http://lifeforce4.wordpress.com/

работает, моргания и вовсе не заметно даже при обновлении с интервалом в 100мс.  Но как я понял оно действует по тому же принципу. Т.е. убирает текст косноли в верх. 

Задача несколько изменилась. У меня данных может быть больше чем строк в консоли тогда механизм скрола будет кхм, ужасен. 
PM MAIL   Вверх
bsa
Дата 29.3.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(cupper @  29.3.2011,  16:26 Найти цитируемый пост)
если вы намекнете как это сделать вы возможно спасете меня от создание GUI

Я так понимаю, технических проблем в использовании GUI нет? Если так, то зачем париться?!? Сделай GUI (Qt, Gtk, wxWidgets) и радуйся жизни.
PM   Вверх
cupper
Дата 29.3.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(bsa @ 29.3.2011,  17:15)
Цитата(cupper @  29.3.2011,  16:26 Найти цитируемый пост)
если вы намекнете как это сделать вы возможно спасете меня от создание GUI

Я так понимаю, технических проблем в использовании GUI нет? Если так, то зачем париться?!? Сделай GUI (Qt, Gtk, wxWidgets) и радуйся жизни.

ну а все же ?

Qt из за лиценции не подойдет. Gtk еще нужно разобраться как это там сделать. Ну по сути если встанет задача что нужно именно GUI оно и будет сделано, изначально требования были просты - консольное приложение. 
PM MAIL   Вверх
bsa
Дата 29.3.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(cupper @  29.3.2011,  18:27 Найти цитируемый пост)
Qt из за лиценции не подойдет.

А ты ее читал? Уверен, что "где-то когда-то слышал, что коммерческие программы на ее основе делать нельзя". Я прав? Так вот, начиная с версии 4.5 (если память не изменяет), Qt поставляется под лицензией LGPL, которая позволяет делать закрытое ПО.
PM   Вверх
borisbn
Дата 29.3.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(cupper @  29.3.2011,  18:27 Найти цитируемый пост)
Qt из за лиценции не подойдет


cupper, опиши, если не секрет, в двух словах свою ситуацию с лицензированием. Просто интересно, под какие задачи/требования не подходит LGPL...

Это сообщение отредактировал(а) borisbn - 29.3.2011, 23:01


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cupper
Дата 30.3.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Цитата(borisbn @ 29.3.2011,  21:36)
Цитата(cupper @  29.3.2011,  18:27 Найти цитируемый пост)
Qt из за лиценции не подойдет


cupper, опиши, если не секрет, в двух словах свою ситуацию с лицензированием. Просто интересно, под какие задачи/требования не подходит LGPL...

под коммерческий проект с закрытым исходным кодом ? Возможно я и ошибаюсь ( я просто где то случайно это увидел), суть то не в этом. Не я решаю что использовать.
PM MAIL   Вверх
borisbn
Дата 30.3.2011, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(cupper @  30.3.2011,  08:54 Найти цитируемый пост)
под коммерческий проект с закрытым исходным кодом ?

без проблем.

Цитата(cupper @  30.3.2011,  08:54 Найти цитируемый пост)
Не я решаю что использовать.

тогда другое дело


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1203 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.