我正在使用以下方法将整数转换为字符串
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
答案 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。
依赖任何特定行为的常见警告持有。不过,如果发生了戏剧性的事情,我会感到失望。