[英]C++ output to windows terminal using cout<<term_cc<color, default, attrib> outputs colors and attributes properly on Windows but not on Linux
以為我已經做好了准備並准備提交這個小項目,直到我得到了這個意想不到的曲線。 目的是使用令牌詞法分析器進行分析。 本質上<underline><red> R <green> G </green> <blue> B </blue> and back to red </red></underline>
輸出為:“ RGB並返回紅色”顏色和屬性。
在Windows上一切正常,但是當我將其移至Linux系統時,它不會顯示任何顏色代碼。
#include <iostream>
#include <sstream>
#include <stack>
#include <map>
#include <cstdlib>
#include <vector>
#include "cmd.h"
#include "Lexer.h" // you should make use of the provided Lexer
#include "term_control.h"
#include "error_handling.h"
using namespace std;
map<string, term_colors_t> colorMap;
map<string, term_attrib_t> attribMap;
string display(const string& expression)
{
if(validate(expression) == "VALID") {
Lexer lex;
Token tok;
vector<term_colors_t> colorVect;
vector<term_attrib_t> attribVect;
lex.set_input(expression);
while(lex.has_more_token()){
tok = lex.next_token();
string sTok = tok.value;
if(tok.type == TAG && tok.value.at(0) != '/'){
cout<<term_cc(colorMap[tok.value], DEFAULT_COLOR, attribMap[tok.value]);
colorVect.push_back(colorMap[tok.value]);
attribVect.push_back(attribMap[tok.value]);
}
if(tok.type == TAG && tok.value.at(0) == '/'){
colorVect.pop_back();
cout<<term_cc(colorVect.back(), DEFAULT_COLOR, attribVect.back());
}
if(tok.type != TAG){
cout<<tok.value;
}
}
}
else if(validate(expression) != "VALID") return validate(expression);
return "";
}
_
cout<term_cc(Color, DEFAULT_COLOR, Attribute)
是我一直在尋找問題的隱藏問題的特定方法,似乎找不到合適的方法。
cout<<term_fg(color)
該方法可以在Linux系統上正確顯示顏色,但是我無法使用該方法設置屬性。
我讀過的所有內容都只涉及顏色,而不涉及顏色和屬性,它們還使用echo命令和特定終端的硬編碼顏色。 這些都需要對我的所有代碼進行認真的更改,並使其無法在Windows上運行,而只能在Linux上運行,因此我嘗試避免這種情況。
在此先感謝您提供有關此問題的任何建議,我非常感謝每個人,希望我能夠在12點之前獲得此建議!
這不是很清楚,我在那里colorMap
和attribMap
被初始化到什么價值觀,我只是本能這里,但它很可能是對鍵colorMap
是顏色和按鍵attribMap
的屬性。 在這種情況下, underline
是不是一個關鍵colorMap
和red
是不是一個關鍵attribMap
。
在程序中,執行以下操作:
if(tok.type == TAG && tok.value.at(0) != '/'){
cout<<term_cc(colorMap[tok.value], DEFAULT_COLOR, attribMap[tok.value]);
它假定每個TAG
是存在於colorMap
和attribMap
。 但是,如果標簽是"red"
類的顏色,則(可能)僅在colorMap
,如果它是"underline"
類的屬性,則(可能)僅在attribMap
。
現在,當您執行colorMap["underline"]
時會發生什么? 在這里,C ++標准庫的便利性可能會有點不利,因為它會靜默地隱藏錯誤。 答案是將從"underline"
到term_colors_t
的默認值的映射添加到該映射,以便查找將始終返回某些內容。 term_colors_t
是一個枚舉,因此其默認值為0
( 不是 '0'
)。
現在, term_cc
-如果是相同term_cc
是@MikePetch挖出了-不檢查其參數的有效性; 它只是假設它們是有效的ANSI數字( '0'
至'9'
,或換句話說,介於48和57之間的數字,包括端點)。由於它不檢查它們,因此僅輸出包含它們的原樣。輸出,並且由於您(可能)使用屬性參數0(即NUL
字符)調用term_cc
,因此將NUL
作為假定的控制台代碼的一部分輸出。
我檢查了xterm
, konsole
和Linux控制台,所有這些都忽略了NUL
字符。 (我相信這是預期的行為;像VT-100一樣的DEC終端會忽略NUL
,盡管在某些情況下您需要插入它們,因為如果先前的控制花費太長時間,終端也會忽略任何字符。)我不會知道您正在使用哪種終端仿真器,並且它很有可能具有不同的行為,例如終止控制代碼序列。 term_cc
即使是第三個參數,也將首先輸出該屬性,因此很可能NUL
屬性將導致終端仿真器僅打印;31;49m
而不是將前景色設置為紅色。
其他一些錯誤:
您永遠不會彈出attribVect
; 僅colorVect
。 因此,我看不到如何正確還原屬性。
您無需將colorVect
初始化為DEFAULT_COLOR
。 因此,在彈出第一個標簽之后,您將從colorVect
彈出(唯一)元素,將其保留為空,然后調用colorVect.back()
,如果colorVect
為空,則該colorVect
未定義。
這些只是我在代碼中快速瀏覽的內容。 可能還有其他問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.