【问题标题】:Can one adjust the colour of output text to a text file?可以将输出文本的颜色调整为文本文件吗?
【发布时间】:2016-09-02 02:37:37
【问题描述】:

我发现fprintf 没有天生的能力来调整输出文本的颜色,并且通过“conio.h”使用的cprintf 无法打印到文件(无论如何我都找不到)。

我希望能够在“data.text”文件中将fprintf 输出的颜色调整为绿色。

static void cursor_position_callback(GLFWwindow* w, double x, double y)
{
    FILE *f = fopen("data.txt", "a");
    if (f==NULL)
    {
        printf("Error opening file!\n");
    }

    fprintf(f,"%0.3f: Cursor position: %f %f (%+f %+f)\n",
           glfwGetTime(),
           x, y, x - cursor_x, y - cursor_y);

    cursor_x = x;
    cursor_y = y;
    fclose(f);
}

输出将用于在涉及眼手跟踪功能的实验中运行鼠标跟踪数据。非常感谢您的宝贵时间。

【问题讨论】:

  • 一个文本文件包含 text,它没有其他信息。您可以将ASNI / VT100 escape codes 保存为文件中的颜色,但这将保存为原始转义序列,由文件的读者来解析和处理序列。如果在不支持序列的程序中打开文件,也会使文件难以阅读(用户),因为文本将嵌入与实际文本无关的“奇怪”字符。

标签: c printf


【解决方案1】:

文件只是一个字节序列;它的内容从来没有颜色。颜色是仅在显示信息时出现的东西(在监视器上或在纸上打印时)。但是,如果读取文件的程序知道如何对文件内容做出正确反应,则显示什么颜色的选择可能会受到文件中信息的影响。这实质上意味着您需要定义(或使用现有的)文件格式:关于如何构建和解释文件内容的规则。例如(忽略 StackOverflow 着色;这应该表示文本文件中的未着色文本):

Some of this text is <red>colored</red> in <blue>different</blue> ways.

现在,显示此内容的程序必须查找出现的 &lt;color&gt;/&lt;/color&gt; 对,并在显示包含的文本之前相应地更改控制台颜色。请注意,如果您要显示的文本本身可能恰好包含&lt;red&gt;,则需要某种转义机制,例如确定&lt;&lt; 将代表文字&lt;

如您所知,定义文件格式并不容易,您可能应该坚持使用具有现有解析器的既定格式。

【讨论】:

    【解决方案2】:

    在通常的实践中,“文本”这个词经常被(误用)在更广泛的意义上。在 C 编程实践中,该术语的严格含义也是通常所说的“纯文本”格式(与“富文本”格式和其他一些文本格式相反)。让我们看看这个简单的演示程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    FILE* testfile;
        fprintf(stdout, "%c\x1b[31m",27);    
        fprintf(stdout, "===================TITLE=================\n");
        fprintf(stdout, "%c\x1b[0m", 27); 
        fprintf(stdout, "This is a plain text coloration test in C\n");
    
        if((testfile = fopen("test.txt", "r" )) == NULL){
            testfile = fopen("test.txt", "w" );
            if(testfile != NULL ){
                fprintf(testfile, "%c\x1b[31m",27);    
                fprintf(testfile, "===================TITLE=================\n");
                fprintf(testfile, "%c\x1b[0m", 27); 
                fprintf(testfile, "This is a plain text coloration test in C\n");    
                fclose(testfile);    
            }
        }
    return 0;
    }
    

    只要fprintf 写入stoutstderr,终端和shell 就可以将ANSI / VT 100 转义序列解释为颜色,但如果它改为写入常规文件,这就是写入的内容到文件:

    [31m===================TITLE=================
    [0mThis is a plain text coloration test in C

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多