Fortran的彩色终端输出

dee*_*pak 13 fortran fortran90

我的程序向终端输出计算状态,并包含相当多的信息.我想,如果可能的话,颜色代码文本的部分.

我已经看到如何通过引用此站点上的线程在Bash和C++中完成它.但是,我无法使用其中任何一个来在Fortran(现代)中实现相同的结果.例如,我尝试了这个示例代码,我认为应该可以使用:

PROGRAM test
    PRINT*, 'A great color is \033[95m pink \033[0m.'
END PROGRAM test
Run Code Online (Sandbox Code Playgroud)

我原本预计输出会是"粉红色的粉红色".相反,我得到"一个伟大的颜色是\ 033 [95米粉红色\ 033 [0m." 我不明白我错过了什么.

如果我用以下代码替换代码中的打印行:CALL EXECUTE_COMMAND_LINE("echo"一个很好的颜色是\ 033 [95m pink\033 [0m.'"))然后我根据需要得到输出.但是我不想继续从我的代码中调用echo.有什么方法可以获得彩色输出吗?

谢谢!

Don*_*oby 18

转义字符表示为'\ 033'似乎不适合您.我没有fortran方便检查,但你可以通过调用char转换函数尝试显式使用字符而不是c风格转义,即通过调用生成实际字符char(27)并将其构建到正确位置的输出字符串中.

  • 唐是对的.Fortran标准留下了与终端交互的细节故意非常模糊,因此无法保证不可打印的字符能做正确的事情,但作为一个实际问题,使用gcc,intel和pathscale f90编译器,以下行可行对我来说:'打印*,'一个很棒的颜色是'// achar(27)//'[95m pink'// achar(27)//'[0m.'` (8认同)

Chr*_*ris 5

我刚刚偶然发现了错误的模块/库,它似乎完全符合您的要求。我还没有使用过它,但很快就会尝试一下,因为从我的 Fortran 程序中格式化终端输出会非常有用。


use*_*010 5

这是一个古老的问题,但我想我会回答我的答案,以防任何人后来(因为我这样做)寻找答案.

我遇到了类似的问题,试图使转义序列工作.我最终去了gfortran手册页.搜索'escape'引导我进入编译器选项'-fbackslash'.从手册页:

将字符串文字中反斜杠的解释从单个反斜杠字符更改为"C风格"转义字符.以下组合扩展为"\ a","\ b","\ f","\n","\ r","\ t","\ v","\"和"\ 0"以ASCII字符警报,退格键,换页符,换行符,回车符,水平制表符,垂直制表符,反斜杠和NUL.此外,"\ x"nn,"\ u"nnnn和"\ U"nnnnnnnn(其中每个n是十六进制数字)被转换为与指定代码点对应的Unicode字符.前面带\的字符的所有其他组合都是未展开的.

因此,要使转义序列在Fortran中工作,我们需要做的就是使用此选项进行编译.有一点不同的是,我们必须使用十六进制数字和x而不是八进制数字.在这个特定的情况下,而不是\033我们使用\x1B.例如,PRINT *, "\x1B[31mThis text is red.\x1B[0m将以红色打印一些文本.

我认为这种方法绝对比每次我们想要使用颜色时连接一堆单独定义的字符更可取.


Ant*_*n B 5

如果要使用ifort进行编译,则需要使用"-assume bscc"进行编译,然后才能使用

PRINT*, 'A great color is \033[95m pink \033[0m.'
Run Code Online (Sandbox Code Playgroud)

代码是:

[90m=dark grey           [30m=black
[91m=peach               [31m=red
[92m=light green         [32m=green
[93m=light yellow        [33m=yellow
[94m=light blue          [34m=blue
[95m=pink                [35m=purple
[96m=light aqua          [36m=aqua
[97m=pearl white
Run Code Online (Sandbox Code Playgroud)

  • 这导致对某个特定编译器的特征的丑陋依赖. (3认同)