c++ - 如何将 printf xterm 代码转换为 ostringstream?

标签 c++ c terminal

问题

我正在尝试将一些 C printf 代码转换为 std::ostringstream,但我在十六进制/终端编码方面遇到了问题。我想也许序列 \x1b[48;5; 需要立即翻译,但我不确定 C++ 中的等价物是什么。

错误结果,部分 (C++)

Color cube, 6x6x6:
1b[48;5;10m  1b[48;5;10m  1b[48;5;11m  1b[48;5;11m  1b[48;5;12m  1b[48;5;12m  1b[48;5;13m  1b[48;5;13m  1b[48;5;14m  1b[48;5;14m  1b[48;5;15m  1b[48;5;15m  1b[0m 1b[48;5;34m  1b[48;5;34m  1b[48;5;35m  

良好的结果,xterm (C)

enter image description here

C代码

void Color_Cube()
{
  for (unsigned green=0; green<6; ++green)
  {
    for (unsigned red=0; red<6; ++red)
    {
      for (unsigned blue=0; blue<6; ++blue)
      {
        unsigned color = 16 + (red * 36) + (green * 6) + blue;
        printf( "\x1b[48;5;%dm  ", color );
      }
      printf( "\x1b[0m " );
    }
    printf( "\n" );
  }
}

失败的 C++ 代码

void Color_Cube_cpp()
{
  std::ostringstream  oss;
  for (unsigned green=0; green<6; ++green)
  {
    for (unsigned red=0; red<6; ++red)
    {
      for (unsigned blue=0; blue<6; ++blue)
      {
        unsigned color = 16 + (red * 36) + (green * 6) + blue;
        oss << std::hex << static_cast<int>(0x1b) << std::dec
          << "[48;5;" << color << "m  ";
      }
      oss << std::hex << static_cast<int>(0x1b) << std::dec << "[0m ";
    }
    oss << "\n";
  }
  std::cerr << oss.str() << "\n";
}

最佳答案

你快到了。您需要流式传输转义字符 '\x1b' 而不是整数 0x1b:

#include <sstream>
#include <iostream>

void Color_Cube_cpp()
{
  std::ostringstream  oss;
  for (unsigned green=0; green<6; ++green)
  {
    for (unsigned red=0; red<6; ++red)
    {
      for (unsigned blue=0; blue<6; ++blue)
      {
        unsigned color = 16 + (red * 36) + (green * 6) + blue;
          oss << "\x1b[48;5;" << color << "m  ";
      }
      oss << "\x1b[0m ";
    }
    oss << "\n";
  }
  std::cerr << oss.str() << "\n";
}

关于c++ - 如何将 printf xterm 代码转换为 ostringstream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16870317/

相关文章:

java - JDBC 驱动程序和终端类路径

php - "sudo composer"命令有效但 "composer"无效?

C++ 分发具有依赖关系的程序

c++ - 从命令行运行到 "Run without Debugging"的不同行为

java - 如何在不使用任何内置方法或函数的情况下在恒定时间 (O(1)) 内获取字母表 (1-26) 中字符的数值/位置?

c++ - char* 的“查找”等效函数

c - 链表和指针混淆

c++ - 将字符串数组传递给多个进程的 for 循环中的 CreateProcess

c - C中的二次方程式帮助。

linux - "sudo"命令如何工作?