C fprintf颜色

时间:2016-03-30 16:33:49

标签: c linux file ubuntu

有没有办法在Ubuntu Linux上使用C编程语言将彩色文本打印到文件中,您可以使用带有printf()的颜色代码并将彩色文本打印到控制台或终端窗口,但如何使用颜色将文本打印到文本文件?

2 个答案:

答案 0 :(得分:0)

简短的回答是你做不到,答案很长,你需要在可用的许多格式上写下某种标记以及你的文本。您没有通用标准可供使用,因此您需要选择一个。

颜色代码特定于控制台,对于打印没有用,如果你只是将文本重新显示回屏幕,没问题,但如果你想打印它,那么你需要做一些工作

最简单的方法是编写HTML标签,以便在浏览器中查看并从那里打印。使用打印机的标记代码写入打印机也是可能的,并且在某些打印机上可能很简单(或几乎不可能)。缺点是这是打印机特定的解决方案。如果您真的是PDF格式(仅仅是文本),RTF或任何其他文档格式的雄心勃勃的输出,但这需要时间和技能。

答案 1 :(得分:0)

我正在使用这个解决方案,如果您使用的是流和C ++,那么这个解决方案非常简洁

#include <cstdlib>
#include <iostream>
#include <sstream>

namespace sps {
  namespace colors {
    enum color {
      none    = 0x00,
      black   = 0x01,
      red     = 0x02,
      green   = 0x03,
      yellow  = 0x04,
      blue    = 0x05,
      magenta = 0x06,
      cyan    = 0x07,
      white   = 0x08
    };
  }
  namespace faces {
    enum face {
      normal    = 0x00,
      bold      = 0x01,
      dark      = 0x02,
      uline     = 0x04,
      invert    = 0x07,
      invisible = 0x08,
      cline     = 0x09
    };
  }

  /**
   * Generate string for color codes for std::iostream's
   *
   * @param foreground
   * @param background
   *
   * @return
   *
   * Usage:
   *
   * using namespace sps;
   * std::cout << "These words should be colored [ "
   *           << set_color(colors::red)   << "red "
   *           << set_color(colors::green) << "green "
   *           << set_color(colors::blue)  << "blue"
   *           << set_color() <<  " ]" << std::endl;
   *
   */
  static inline std::string set_color(sps::colors::color foreground = sps::colors::none,
                                      sps::colors::color background = sps::colors::none) {
    std::stringstream s;
    s << "\033[";
    if (!foreground && ! background){
        s << "0"; // reset colors if no params
    }
    if (foreground) {
        s << 29 + foreground;
        if (background) s << ";";
    }
    if (background) {
        s << 39 + background;
    }
    s << "m";
    return s.str();
  }

  /**
   *
   *
   * @param face
   *
   * @return
   */
  static inline std::string set_face(sps::faces::face face = sps::faces::normal) {
    std::stringstream s;
    s << "\033[";
    if (!face) {
        s << "0"; // reset face
    }
    if (face) {
      s << face;
    }
    s << "m";
    return s.str();
  }
}

int main(int agrc, char* argv[])
{
  using namespace sps;
  std::cout << "These words should be colored [ "
        << set_color(colors::red)   << "red "
        << set_color(colors::green) << "green "
        << set_color(colors::blue)  << "blue "
        << set_color(colors::cyan)   << "cyan "
        << set_color(colors::magenta) << "magenta "
        << set_color(colors::yellow)  << "yellow"
        << set_color() <<  " ]" << std::endl;
  return EXIT_SUCCESS;
}