Rating@Mail.ru

Форум по операционной системе GNU/Linux и свободному программному обеспечению


Текущее время: 23 сен 2017, 08:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: отображение цветом в терминале
Непрочитанное сообщениеДобавлено: 13 июн 2017, 12:58 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10071
Откуда: Харьков
Иногда возникает потребность выделять какие-то выводы в терминал цветом.
На то есть (описаны, используются) разные способы: ESC управляющие последовательности (использующиеся ещё со времён MS-DOS), возможности пакета ncurses и др.

Но проблема (неприятность) в том, что:
- при работе в Linux практически повсеместно используется эмулятор терминала в графическом окружении рабочего стола (DE)...
- в зависимости от вида DE (которых десяток или более: KDE, GNOME, Mate, Cinnamon, ...) + используемой программы эмулятора терминала (которых в каждом DE тоже может быть несколько штук) - отдельные ESC последовательности могут отрабатываться, а могут и нет... (у меня, пока ;-) , не отрабатываются ... или я ещё не разобрался почему)
- но ещё хуже, когда предстоит перенос кода программы в другую операционную систему, главным образом в Windows, с тем, чтобы и там в их текстовой консоли отображение делалось так же.

И вот есть тут такой проект C++ (подсказали), который позволяет управлять характеристиками вывода в терминал (не только цвет) независимо от платформы: rang.
Оно, обещано ;-) , работает равнозначно в коде Linux, Windows, MacOS и т.д.
Испытаем!


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: отображение цветом в терминале
Непрочитанное сообщениеДобавлено: 13 июн 2017, 13:23 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10071
Откуда: Харьков
Olej писал(а):
Испытаем!

Т.е., как оказывается, у них там есть, и единственно нужен, заголовочный файл:
Код:
[olej@dell rang]$ ls -l rang.hpp
-rw-rw-r-- 1 olej olej 6540 июн 12 02:15 rang.hpp

Который всего лишь подключается #include ...
Вот их же пример кода:
Код:
#include <iostream>
#include "rang.hpp"
using namespace std;

int main( int argc, char** argv ) {
   cout << "No rang?"
        << rang::bg::red
        << rang::fg::gray
        << "RANG!!!"
        << rang::style::reset
        << endl;
}

И исполнение его показано на картинке.
P.S. Единственно, обращаю внимание, что компиляция требуется с указанием опциями совместимости со стандартом C++11 (2011 года):
Код:
[olej@dell rang]$ make rang-test
g++ -Wall -std=c++11 -O3      rang-test.cc   -o rang-test


Вложения:
r1.png
r1.png [ 62.95 КБ | Просмотров: 221 ]
rang.hpp [6.39 КБ]
Скачиваний: 15
rang-test.cc [262 байт]
Скачиваний: 15
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: отображение цветом в терминале
Непрочитанное сообщениеДобавлено: 13 июн 2017, 19:47 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10071
Откуда: Харьков
Olej писал(а):
Испытаем!

Этот вот новый интерес к такой теме возник из задачи (учебной, студенческой) ... вот как я её переформулирую, выбросив всё лишнее:
Цитата:
Программа читает текстовый файл (имя с расширением .dat, заданное в командной строке запуска).
После этого программа:
- выводит текст на экран дисплея;
- определяет количество символов в каждом слове;
- выбирает для показа самое короткое слово;
- выбранное слово выделяется цветом в выводимом тексте;
- при очередном нажатии клавиши Enter выделение перемещается на следующее по длине слово.

Вообще то говоря, никаких оговорок относительно языка текста (локализации) явно не оговаривается, но по контексту понятно, что текст там может быть, в том числе, русскоязычным. И, по хорошему, всё это должно реализовываться в типах wchar_t и wstring ... но именно разбиение на слова может нормально работать и на широких 4-байтных UTF-8 символах (это один из немногих редких случаях), и поэтому всё я сделаю в терминологии string:
Код:
#include <locale>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#include "rang.hpp"

vector<string>::iterator current;

ostream& operator <<( ostream& out, const vector<string>& v ) {
   for( vector<string>::const_iterator i = v.begin(); i != v.end(); i++ )
      if( i != current )
         out << *i << " ";
      else
         out << rang::fg::red << *i << rang::style::reset
             << "[" << i->length() << "] ";
   return out;
}

bool sort_function( vector<string>::iterator f, vector<string>::iterator s ) {
   return f->length() < s->length();
}

int main( int argc, char** argv ) {
   setlocale( LC_ALL, "rus" ); 
   if( argc != 2 ) {
      cerr << "не указан файл данных" << endl;
      return 1;
   }
   ifstream fin;
   fin.open( argv[ 1 ] );
   if( !fin ) {
      cerr << "файл данных не найден: " << argv[ 1 ] << endl;
      return 1;
   }
   string line;
   do {
      getline( fin, line );
      cout << line << endl;
   } while( fin );
   fin.close();
   fin.open( argv[ 1 ] );
   vector<string> vw{ istream_iterator<string>( fin ), istream_iterator<string>() };
   cout << "- в вашем тексте слов: " << vw.size() << endl;
   vector<vector<string>::iterator> vp( vw.size() );
   unsigned np = 0;
   for( vector<string>::iterator w = vw.begin(); w != vw.end(); w++ )
      vp[ np++ ] = w; 
   sort( vp.begin(), vp.end(), sort_function );
   cout << "дальше жмите Enter ..." << endl;
   np = 0;
   while( true ) {
      current = vp[ np ];
      getline( cin, line );
      if( ++np >= vp.size() ) np = 0;
      cout << vw << endl;
   }
}

И то, как это выполняется, показано на картинке.


Вложения:
r2.png
r2.png [ 73.33 КБ | Просмотров: 220 ]
task213s.cc [2.33 КБ]
Скачиваний: 17
213_2.dat [63 байт]
Скачиваний: 16
Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: отображение цветом в терминале
Непрочитанное сообщениеДобавлено: 13 июн 2017, 20:01 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10071
Откуда: Харьков
Olej писал(а):
И то, как это выполняется, показано на картинке.

Там есть ещё ряд интересных деталей:
- для того, чтобы не портить входной текст (не переставлять в бессмыслице слова в векторе vw), я сортирую не сами слова в тексте (по числу байт в слове), а через указатели (итераторы) на них в другом, смежном векторе vp;
- сортировка делается вызовом стандартного алгоритма быстрой сортировки из STL библиотеки C++ (стандартная библиотека):
Код:
sort( vp.begin(), vp.end(), sort_function );

- я только передаю в этот стандартный алгоритм сортировки свою функцию sort_function, которая возвращает критерий сравнения элементов (предикат), по которым производится сортировка;
- я не стал специально в этом месте записывать анонимною лямбда-функцию (как делаю это часто, и что здесь наиболее уместно), а специально выписал эту функцию отдельно для понятности (... ну и для облегчения себе отладки, сознаюсь ;-) );
- сортировка сортирует указатели строк (итераторы) в vp по длине (числу байт) в строках, на которые они (итераторы) указывают.

P.S. И я предполагаю обязательно показать это, выписанное через лямбда-функцию, как наиболее уместное решение ... но позже, когда отлажу и проверю этот вариант.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: отображение цветом в терминале
Непрочитанное сообщениеДобавлено: 13 июн 2017, 20:18 
Не в сети
Писатель
Аватара пользователя

Зарегистрирован: 24 сен 2011, 14:22
Сообщения: 10071
Откуда: Харьков
Olej писал(а):
P.S. И я предполагаю обязательно показать это, выписанное через лямбда-функцию, как наиболее уместное решение ... но позже, когда отлажу и проверю этот вариант.

И выглядит это (показываю только отличающийся оператор сортировки) как-то так:
Код:
   sort( vp.begin(), vp.end(),
         []( vector<string>::iterator f, vector<string>::iterator s )-> bool {
            return f->length() < s->length();
         } );

И выполняется, например, как на картинке.


Вложения:
r3.png
r3.png [ 148.81 КБ | Просмотров: 218 ]
task213sa.cc [1.61 КБ]
Скачиваний: 16
213_1.dat [611 байт]
Скачиваний: 17
Вернуться к началу
 Профиль Отправить личное сообщение  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB
[ Time : 0.336s | 23 Queries | GZIP : On ]