Использование разных цветов в одном потоке строк с ncurses (C ++) - PullRequest
0 голосов
/ 25 марта 2019

Я работаю над кодом и использую ncurses и stringstreams (C ++).

Я хочу напечатать ( только ) число красным, если оно отрицательное, и зеленым, если оно положительное.

По структуре программы я использую единственный поток строк для всего вывода. Поэтому, если я изменю цвет с помощью:

start_color();
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
attron(COLOR_PAIR(1));

Он окрашивает весь вывод (я просто хочу, чтобы цифры были цветными). Я также пробовал с кодом ANSI, но он не работает с ncurses.

Мой код выглядит примерно так:

stringstream_var.clear();
stringstream_var.str(std::string());

if (num1 < 0){
  //I just want to print num1 in red
  stringstream_var << "Number 1: " << num1 << std::endl;
}else{
  //I just want to print num1 in green
  stringstream_var << "Number 1: " << num1 << std::endl;
}

Как я мог достичь этого?

Возможно ли это?

1 Ответ

2 голосов
/ 25 марта 2019

По официальным документам:

пара цветов 0 особенная; оно обозначает «нет цвета».

Таким образом, вы можете создать вспомогательную функцию, которая принимает std::string a и печатает текст с заданным цветом относительно значения COLOR_PAIR. Примерно так:

#include <curses.h>

void print_with_color(const std::string& text, int color_pair) {
    attron(COLOR_PAIR(color_pair));
    printw(text.c_str());
}

void print_without_color(const std::string& text) {
    attron(COLOR_PAIR(0)); // No color
    printw(text.c_str());
}

int main(void) {
    initscr();
    start_color();

    init_pair(1, COLOR_BLACK, COLOR_RED);
    init_pair(2, COLOR_BLACK, COLOR_GREEN);

    print_without_color("Number 1: ");
    int number = std::rand();
    if (number) {
       print_with_color(std::to_string(number), 1);
    } else {
       print_with_color(std::to_string(number), 2);
    }
    refresh();
}

В любом случае, если вы собираетесь использовать потоки C ++, может быть, лучше поискать современную альтернативу. Проверьте termcolor . Вы можете сделать что-то вроде этого:

if (number) {
   std::cout << "Number 1: " << termcolor::red << number << std::endl;
} else {
   std::cout << "Number 1: " << termcolor::green << number << std::endl;
}
...