2013-06-01 19 views
1

問題如何將printf xterm代碼轉換爲ostringstream?

我試圖把一些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"; 
} 

回答

1

你快到了。你需要的流轉義字符'\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"; 
} 
+0

+1洛爾 - 談完整性檢查 - TY! – kfmfe04

0

嘗試用"\x1b"替換std::hex << static_cast<int>(0x1b) << std::dec