16

我的程序将计算状态输出到终端并包含相当多的信息。如果可能的话,我想对文本的部分进行颜色编码。

通过参考本网站上的线程,我已经了解了如何在 Bash 和 C++ 中完成它。但是,我无法使用其中任何一个来在 Fortran(现代)中获得相同的结果。例如,我尝试了这个示例代码,我认为它应该可以工作:

PROGRAM test
    PRINT*, 'A great color is \033[95m pink \033[0m.'
END PROGRAM test

我本来希望输出是“一种很棒的颜色是粉红色”,其中粉红色是粉红色。相反,我得到“一种很棒的颜色是 \033[95m 粉红色 \033[0m”。我不明白我错过了什么。

如果我将代码中的打印行替换为: CALL EXECUTE_COMMAND_LINE("echo 'A great color is \033[95m pink \033[0m.'") 那么我会得到所需的输出。但是我不想继续从我的代码中调用 echo 。有什么办法可以得到彩色输出?

谢谢!

4

4 回答 4

19

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

于 2011-06-19T14:15:53.920 回答
6

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

PRINT*, 'A great color is \033[95m pink \033[0m.'

代码是:

[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
于 2014-09-18T16:07:50.800 回答
6

这是一个老问题,但我想我会提出我的答案,以防以后有人(就像我一样)来寻找答案。

我遇到了与您类似的问题,试图让转义序列起作用。我最终去了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将以红色打印一些文本。

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

于 2013-11-25T04:45:54.617 回答
4

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

于 2011-12-17T12:27:46.710 回答