将整数传递给字符串

时间:2014-12-13 19:13:12

标签: fortran

我正在使用以下方法将整数转换为字符串

Character (len=10) :: s
Integer :: i
i = 7
Write (s, *, iostat=ios) i

然而,这会使s的内容为空。当我引入显式格式时,s按预期填充。

Character (len=10) :: s
Integer :: i
i = 7
Write (s, "(i3)", iostat=ios) i

看起来这个问题与字符串s的长度有关,因为 当我使用更长的长度时,我会得到正确的数字。

Character (len=25) :: s

1 个答案:

答案 0 :(得分:2)

从中学到的第一课是:如果使用iostat=说明符,请检查结果。但是,代码的行为似乎无法保证。我将根据你的编译器如何处理事情来解决这部分答案。

除了iostat=说明符之外,一般来说,你可以使用iomsg=说明符中的iostat=说明符来获取友情信息。 [正如IanH所指出的那样,只有在character (len=10) s character (len=58) mesg integer ios write(s,*, iostat=ios, iomsg=mesg) 7 if (ios/=0) print*, ios, TRIM(mesg) 说明符的变量被(或将被设置为非零)的情况下,才会更新指定变量,特别是可能保持未定义。]

mesg

您要检查此内容,因为您正在使用列表定向输出。在这里,编译器可以自由选择整数编辑格式的“合理”值。对于默认的整数类型,字段可能长于9(不要忘记前导空白)。因此,它不适合长度为10的字符记录:在这种情况下,“{1}}对于”记录结束“是合理的。

使用显式格式I3,它非常适合备用。

为什么您将LEN_TRIM(s)视为10,s实际上可能会变成垃圾。

现在,进入最后一部分。看来,带有列表定向输出的代码无效。 Fortran 2008(我认为很多其他人)明确指出:

  

在输出时,输出列表和格式规范不应为记录指定多于...内部文件的记录长度。

内部文件的记录长度为10。

依赖任何特定行为的常见警告持有。不过,如果发生了戏剧性的事情,我会感到失望。