Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > красивый вывод в консоль


Автор: cupper 15.3.2011, 23:09
Нужно распечатать в консоль список данных. По определенным параметрам та или иная строка данных должна быть окрашена определенным цветом.

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

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

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

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

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

И это нужно сделать и для win и для linux.
Подскажите.

Автор: bsa 17.3.2011, 13:13
стаднартного метода нет.
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/

Автор: cupper 18.3.2011, 17:16
Сделал так
Код

#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();
        }

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

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

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


но сильно заметно как консоль мерцает. Как можно избежать этого мерцания ?

Автор: 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/

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

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

если вы намекнете как это сделать вы возможно спасете меня от создание GUI smile

Автор: cupper 29.3.2011, 16:47
Цитата(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мс.  Но как я понял оно действует по тому же принципу. Т.е. убирает текст косноли в верх. 

Задача несколько изменилась. У меня данных может быть больше чем строк в консоли тогда механизм скрола будет кхм, ужасен. 

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

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

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

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

ну а все же ?

Qt из за лиценции не подойдет. Gtk еще нужно разобраться как это там сделать. Ну по сути если встанет задача что нужно именно GUI оно и будет сделано, изначально требования были просты - консольное приложение. 

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

А ты ее читал? Уверен, что "где-то когда-то слышал, что коммерческие программы на ее основе делать нельзя". Я прав? Так вот, начиная с версии 4.5 (если память не изменяет), Qt поставляется под лицензией LGPL, которая позволяет делать закрытое ПО.

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


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

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


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

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

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

без проблем.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)