在 Fortran 写入中转义引号并删除双换行符
escape quotes and remove double newline in fortran write
我正在尝试在 Fortran90 中输出一条简单的错误消息,如下所示:
error: failed to read '<file>'
但我不知道如何生成单引号,转义它们会导致编译错误。我尝试了以下方法:
write(*, fmt="('error: failed to read: \'', a, '\'')") arg
此外,如果我在没有它们的情况下打印消息:
write(*, fmt="('error: failed to read: ', a)") file
在命令行上产生了一个额外的换行符(即总共两个)。我是通过执行call getarg(1, arg)
得到arg
,可能跟这个有关
这是一个演示换行符问题的最小工作示例:
program foo
character(len=100) :: arg
call getarg(1, arg)
write(*, fmt="('error: failed to read: ', a)") arg
end program foo
我发现 fortran 格式的输出非常不直观,如果有人可以另外指导我找到更详细地解释这一点的资源,那就太好了。
在我看来,最好不要像在 C 中那样将打印的字符串输入到格式中,而是将它们放入输出列表中。
我还建议在打印时 trim 文件名 trim(arg)
,这样你就不会打印大约 90 个无用的尾随空白。
program foo
implicit none
character(len=100) :: arg
call getarg(1, arg)
write(*, '(*(a))') "error: failed to read: '", trim(arg), "'"
end program foo
这样一来,您就不需要引用格式字符串本身的外层引号。
即使在任何字符串中,您也可以重复引号以将其放入字符串中,即 ''''(参见 Difference between double and single quotation marks in fortran?)
顺便说一句,标准 Fortran 2003 有子例程 GET_COMMAND_ARGUMENT
而不是 GETARG
.
如果您希望与原始示例保持接近,这里是三个修复的摘要。我还使用了一个可分配的字符变量来获取信息[并且因为我喜欢这个特性:-)]。您可以独立选择修复程序。
program foo
! always use implicit none at the beginning of a program
implicit none
! use an allocatable character variable. The length can be specified later
character(len=:), allocatable :: arg
! you need a variable to store the length of the argument
integer :: arg_len
! obtain the length of the argument
call get_command_argument(1, length=arg_len)
! allocate the character variable. the length is passed by the type definition of the
! allocate statement
allocate(character(len=arg_len) :: arg)
! actually read the argument, finally!
call get_command_argument(1, value=arg)
! the double quotes *inside* the string generate a single quote character
! the trim is not necessary here, as the character variable has the appropriate
! length. keep it if you stick to a fixed length character variable.
write(*, fmt="('error: failed to read: ''', a, '''')") trim(arg)
end program foo
我正在尝试在 Fortran90 中输出一条简单的错误消息,如下所示:
error: failed to read '<file>'
但我不知道如何生成单引号,转义它们会导致编译错误。我尝试了以下方法:
write(*, fmt="('error: failed to read: \'', a, '\'')") arg
此外,如果我在没有它们的情况下打印消息:
write(*, fmt="('error: failed to read: ', a)") file
在命令行上产生了一个额外的换行符(即总共两个)。我是通过执行call getarg(1, arg)
得到arg
,可能跟这个有关
这是一个演示换行符问题的最小工作示例:
program foo
character(len=100) :: arg
call getarg(1, arg)
write(*, fmt="('error: failed to read: ', a)") arg
end program foo
我发现 fortran 格式的输出非常不直观,如果有人可以另外指导我找到更详细地解释这一点的资源,那就太好了。
在我看来,最好不要像在 C 中那样将打印的字符串输入到格式中,而是将它们放入输出列表中。
我还建议在打印时 trim 文件名 trim(arg)
,这样你就不会打印大约 90 个无用的尾随空白。
program foo
implicit none
character(len=100) :: arg
call getarg(1, arg)
write(*, '(*(a))') "error: failed to read: '", trim(arg), "'"
end program foo
这样一来,您就不需要引用格式字符串本身的外层引号。
即使在任何字符串中,您也可以重复引号以将其放入字符串中,即 ''''(参见 Difference between double and single quotation marks in fortran?)
顺便说一句,标准 Fortran 2003 有子例程 GET_COMMAND_ARGUMENT
而不是 GETARG
.
如果您希望与原始示例保持接近,这里是三个修复的摘要。我还使用了一个可分配的字符变量来获取信息[并且因为我喜欢这个特性:-)]。您可以独立选择修复程序。
program foo
! always use implicit none at the beginning of a program
implicit none
! use an allocatable character variable. The length can be specified later
character(len=:), allocatable :: arg
! you need a variable to store the length of the argument
integer :: arg_len
! obtain the length of the argument
call get_command_argument(1, length=arg_len)
! allocate the character variable. the length is passed by the type definition of the
! allocate statement
allocate(character(len=arg_len) :: arg)
! actually read the argument, finally!
call get_command_argument(1, value=arg)
! the double quotes *inside* the string generate a single quote character
! the trim is not necessary here, as the character variable has the appropriate
! length. keep it if you stick to a fixed length character variable.
write(*, fmt="('error: failed to read: ''', a, '''')") trim(arg)
end program foo