【问题标题】:Problem outputing ANSI escape code from a file (C++)从文件中输出 ANSI 转义码的问题 (C++)
【发布时间】:2021-02-14 06:53:15
【问题描述】:

我正在做一个玩具项目。基本上,它是一组用于制作在终端中运行的游戏的类和函数。我想使用 ANSI 转义码来更改文本颜色、样式、背景颜色等。我正在尝试从文本文件中输入形状和颜色。我将它们存储在一个类中,该类包含一个字符串数组(用于形状)和一个二维字符串数组(用于颜色)。当我对颜色进行硬编码时,它可以正常工作,但是当我从文件(使用 ifstream)输入它们时,它只是输出代码并且对文本样式没有任何作用。

有没有办法在不编写单独的函数来处理输入的代码的情况下解决这个问题?

加载函数:

void charbox::load(std::string path, std::string path2) {
    std::ifstream txt;
    std::string s;
    
    txt.open(path);
    if (txt.is_open() == 0) {
        std::cout << "ERROR 404, " << path << " NOT FOUND!\n";
    }

    while (std::getline(txt,s)) {
        frame.push_back(s);
    }
    txt.close();
        
    txt.open(path2);
    if (txt.is_open() == 0) {
        std::cout << "ERROR 404, " << path2 << " NOT FOUND!\n";
    }
    
    std::vector <std::string> v(frame[0].size(), ""); 
    color.resize(frame.size(), v);
    
    for (int i = 0, height = frame.size(); i < height; i++) {
        for (int j = 0, width = frame[i].size(); j < width; j++) {
            txt >> color[i][j];
        }
    }
    txt.close();
    
}

班级:

class charbox {
    public:
                
        std::vector <std::string> frame;
        std::vector <std::vector <std::string>> color;

        void load(std::string path, std::string path2);
        charbox(int p_width, int p_height);
        charbox(){};
    
    private:
};

当我输出时:

std::cout << <some object>.color[<some index>][<some index>] << "test\n";

我希望根据输入改变“测试”的颜色,但它只是以纯文本的形式输出代码。

path和path2中的文件示例:

路径包含:

[][]
[][]

path2 包含:

\033[1;31;41m \033[1;31;41m \033[1;31;41m \033[1;31;41m
\033[1;31;41m \033[1;31;41m \033[1;31;41m \033[1;31;41m

提前致谢!

附:我正在运行 Linux(特定于 Windows 的解决方案不适合我)。

【问题讨论】:

  • C 和 C++ 是不同的语言。在您的问题中显示一些minimal reproducible example(一些带有main 的代码以及示例输入和所需输出)。我能够在RefPerSys开源C++项目中输出ANSI转义码;从其源代码中汲取灵感
  • 如果没有minimal reproducible example 或任何代码,就不可能说出来
  • 创建一个,例如ANSI_colors.h 带有所需颜色类等的标头,并包含信息而不是从文件中读取信息。
  • “我正在尝试从文本文件中输入形状和颜色”——这是什么意思,文本文件没有形状和颜色!您可以使用cat(1) 来显示它们!请edit你的问题来改进它。在其中添加一些代码。还要解释为什么你不想写一个单独的函数!
  • 您从文件中读取这些代码的方式似乎犯了一些错误。但是如果没有看到你的任何代码,怎么会有人知道那个错误是什么?要回答您实际提出的问题,是的,有可能。

标签: c++ c++11 console-application


【解决方案1】:

问题在于您对转义序列的解释。如果您在字符串文字中写入\033,那么它将被解释为转义字符(ASCII 27)。所以

std::string seq = "\033[1;31;41m";

个字符的字符串,因为 编译器\033 解释为单个字符。

但是如果你把相同的标记放在一个文件中并读取它,那么没有特殊解释,它将被理解为以反斜杠开头的 13 个字符,而不是以转义开头的 10 个字符。

我建议您编写代码以将\033 序列替换为转义字符。像这样的

{
    txt >> color[i][j];
    size_t pos = color[i][j].find("\\033");  // look for \033
    if (pos != std::string::npos)            // if found
        color[i][j].replace(pos, 4, "\033"); // replace with ESC
}

非常重要

查找中的双反斜杠\\ 和替换中的单反斜杠\

【讨论】:

  • 谢谢!但我认为更好的方法是不要将转义字符存储在文件中,而是在 &lt;some object&gt;.color[&lt;some index&gt;][&lt;some index&gt;] 之前输出
  • @LukaRapava 当然,你认为最好。
  • 我的意思是:std::cout &lt;&lt; "\033[ &lt;&lt; &lt;some object&gt;.color[&lt;some index&gt;][&lt;some index&gt;] &lt;&lt; &lt;some text&gt;; 并从文件中删除“\033[”-s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多