我有一个用fortran90编写的程序,它正在将一个数组写入一个文件,但出于某种原因使用asterix来表示多个列:
8*9, 4, 2*9, 4
稍后从文件中读取我会收到I / O错误:
lib-4190:UNRECOVERABLE库错误
数字输入字段包含无效字符。
在来自单元10的列表导向的READ期间遇到Fortran单元10连接到顺序格式化的文本文件:
有没有人知道为什么会这样,以及是否有一个标志要提供给编译器以防止它。我正在使用cray fortran编译器,而write语句看起来像这样:
write (lun,*) nsf_species(bundle%species(1:bundle%n_prim))
更新
数据文件中的行读数如下:
read (lun,*) Info(ifile)%alpha_i(1:size)
我已经检查过以确保导致问题的是这条线。
答案 0 :(得分:2)
在写出大量数据时,这种列表导向输出的压缩是Cray编译环境的一个非常有用的功能。但是,正如您所指出的那样,这种压缩输出将无法正确读取(这不太有用)。
您可以修改此行为,不使用编译器标志,而是使用“assign”命令。
请考虑以下示例代码:
PROGRAM test
IMPLICIT NONE
INTEGER :: u
OPEN(UNIT=u,FILE="f1",FORM="FORMATTED",STATUS="UNKNOWN")
WRITE(u,*) 0,0,0
CLOSE(u)
OPEN(UNIT=u,FILE="f2",FORM="FORMATTED",STATUS="UNKNOWN")
WRITE(u,*) 0,0,0
CLOSE(u)
END PROGRAM test
我们首先使用CCE构建并执行。文件f1和f2都包含压缩输出格式:
$ ftn -o test.x test.F90
$ ./test.x
$ cat f1
3*0
$ cat f2
3*0
现在我们将使用“assign”来修改文件f2中的格式。首先,我们需要定义一个文件名来保存分配信息:
$ export FILENV=my_filenenv
现在我们使用assign来关闭文件f2的压缩输出:
$ assign -y on f:f2
现在我们重新运行实验(无需重新编译):
$ ./test.x
$ cat f1
3*0
$ cat f2
0, 0, 0
对于所有文件,某些文件名模式或许多其他情况,都可以选择执行此操作。
还有其他可以分配的东西。有关详细信息,请参阅加载PrgEnv-cray的“man assign”。
答案 1 :(得分:1)
write语句使用列表定向格式(它仍然是格式化的输出语句 - “格式化”意味着“格式化为人类可以读取它”) - 由括号内部的*
指定该声明。列表定向输出的规则为编译器提供了很大的自由度。通常,如果您确实关心输出的详细信息,则应提供明确的格式。
其中一个适用的规则是结果输出通常应该适合列表定向输入。但是对于列表定向格式的输入允许有一些相当令人惊讶的规则。其中一个功能是您可以使用语法repeat*value
在输入文本中指定输入值的重复计数。
编译器注意到输出中有重复值,因此它使用了这个重复计数功能。
我不知道为什么在列表定向输入下读取文件时会收到错误消息 - 因为您显示的行是列表定向输入的有效输入行。确保导致错误的行实际上是您显示的行。
答案 2 :(得分:0)
一个简单的解决方法是更改write语句,使其不使用压缩格式。例如改为:
write (lun,'(*(I5))') nsf_species(bundle%species(1:bundle%n_prim))
' *'允许任意数量的指定格式的重复,并应抑制压缩的输出格式。
但是,如果编译器以压缩格式输出,则应该能够以相同的压缩格式读回。希望帮助台能够找到无法解决的原因。