0

我有一个用 fortran90 编写的程序,它正在将数组写入文件,但由于某种原因,它使用星号来表示多列:

8*9,  4,  2*9,  4

稍后从文件中读取我收到 I/O 错误:

lib-4190:不可恢复的库错误

数字输入字段包含无效字符。

在单元 10 Fortran 单元 10 的列表导向 READ 期间遇到,连接到一个顺序格式化的文本文件:

有谁知道为什么会发生这种情况,以及是否有一个标志可以提供给编译器以防止它发生。我正在使用 cray fortran 编译器,写语句如下所示:

write (lun,*) nsf_species(bundle%species(1:bundle%n_prim))

更新:

数据文件中读取的行如下所示:

read (lun,*) Info(ifile)%alpha_i(1:size)

我已经检查以确保是这条线导致了问题。

4

3 回答 3

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

对于所有文件、某些文件名模式或许多其他情况,有一些选项可以执行此操作。

assign 还可以做其他事情。有关详细信息,请参阅加载了 PrgEnv-cray 的“man assign”。

于 2015-07-30T13:19:37.537 回答
1

写语句使用列表定向格式(它仍然是一个格式化的输出语句——“格式化”的意思是“格式化以便人类可以阅读它”)——由*语句的括号部分内部指定。列表定向输出的规则为编译器提供了很大的自由度。通常,如果你真的关心输出的细节,你应该提供一个明确的格式。

确实适用的规则之一是生成的输出通常应适用于列表定向输入。但是对于允许作为列表定向格式输入的内容,有一些相当令人惊讶的规则。其中一项功能是您可以在输入文本中使用语法为输入值指定重复计数repeat*value

编译器注意到输出中有重复值,所以它使用了这个重复计数功能。

我不知道为什么您在读取列表定向输入下的文件时收到错误消息 - 因为您显示的行是列表定向输入的有效输入行。确保导致错误的行实际上是您显示的行。

于 2015-07-28T08:03:32.250 回答
1

一个简单的解决方法是更改​​ write 语句,使其不使用压缩格式。例如更改为:

write (lun,'(*(I5))') nsf_species(bundle%species(1:bundle%n_prim))

'*' 允许指定格式的任意数量的重复,并且应该抑制压缩的输出格式。

但是,如果编译器以压缩格式输出,则它应该能够以相同的压缩格式读回。希望帮助台能够找到为什么这不起作用的根源。

于 2015-07-31T08:38:52.893 回答