簡體   English   中英

使用cout將C ++輸出到Windows終端&lt; <term_cc<color, default, attrib> 在Windows上正確輸出顏色和屬性,但在Linux上不正確

[英]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點之前獲得此建議!

這不是很清楚,我在那里colorMapattribMap被初始化到什么價值觀,我只是本能這里,但它很可能是對鍵colorMap是顏色和按鍵attribMap的屬性。 在這種情況下, underline是不是一個關鍵colorMapred是不是一個關鍵attribMap

在程序中,執行以下操作:

if(tok.type == TAG && tok.value.at(0) != '/'){
        cout<<term_cc(colorMap[tok.value], DEFAULT_COLOR, attribMap[tok.value]);

它假定每個TAG是存在於colorMapattribMap 但是,如果標簽是"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作為假定的控制台代碼的一部分輸出。

我檢查了xtermkonsole和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM