【问题标题】:Dealing with iostream manipulators and ANSI console color codes处理 iostream 操纵器和 ANSI 控制台颜色代码
【发布时间】:2014-09-23 13:13:42
【问题描述】:

我在 Unix 控制台中使用 ANSI 颜色代码来格式化我的输出。

const auto& getCode(Color mColor) 
{
    static std::map<Color, std::string> codes;
    // ...
    return codes[mColor]
}

cout << getCode(Color::Red) << "red text";

但是,当使用std::setwstd::left 等操纵符时,结果会受到颜色代码的影响,因为它是一堆字符。

我应该如何处理这个问题?有没有办法让流操纵器忽略颜色代码?

【问题讨论】:

  • 你的意思是让它们原封不动地通过而不影响其他任何东西? getCode的定义是什么?
  • 你的函数返回int还是char?请与我们分享 getCode 原型。
  • getCode 是带有输出流运算符的结构吗?也许您对设置和恢复 iostream 标志感兴趣:stackoverflow.com/questions/4217704/…
  • @Sven:更好的函数返回一个可流式传输的struct
  • 我怀疑你的意思是 ANSI 颜色代码? ASCII 不定义颜色。

标签: c++ c++11 console iostream manipulators


【解决方案1】:

getCode 返回的类型是什么?如果不是 std::stringchar const*,你需要做的就是写 一个&lt;&lt; 它忽略了你不想要的格式化数据 去影响它。如果它是 C++ 的字符串类型之一,那么你 应该可能将调用包装在一个特殊的对象中,使用&lt;&lt; 对于该对象类型,例如:

class ColorCode
{
    ColorType myColor;
public:
    ColorCode(ColorType color) : myColor( color ) {}
    friend std::ostream& operator<<( std::ostream& dest, ColorCode const& cc )
    {
        std::string escapeSequence = getCode( myColor );
        for ( char ch : escapeSequence ) {
            dest.put( ch );
        }
        return dest;
    }
};

【讨论】:

  • 我怀疑它返回"\x1B[41m"。我同意你的想法更好,你可以写cout &lt;&lt; Color::Red &lt;&lt; "red text";
  • 非常感谢!就这么简单。我已经在测试对格式化字符串和颜色代码进行排序的缓存流的实现......结果你只需要一个简单的包装类!
猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 2015-04-25
  • 2015-01-10
  • 2011-03-17
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多