无法将文本文件读入Fortran数组

时间:2018-05-08 11:16:51

标签: fortran eof

我正在编写一个程序,该程序必须从文本文件中读取线性方程组 Ax = B augmented matrix (A|B),并将其存储到矩阵中以解决它后面。

我解决方程系统的例程似乎有效,但我在阅读文件本身时遇到了麻烦,这不应该太难,但此时我已经混淆了。文本文件包含一个实数矩阵,其宽N+1个条目(系数矩阵加上相应的独立项条目)和N条目高。我的尝试(使用N=5系统)就是这个:

        OPEN(10,FILE="sistema.txt")
            DO I=1,N
                DO J=1,(N+1)
                    IF(J==(N+1)) THEN
                        READ(10,*) B(I)
                        ELSE
                        READ(10,*) A(I,J)
                    END IF
                END DO
            END DO
    CLOSE(10)

A(1:N,1:n)是一个真实数组而B(1:N)是一个真实数组(并且N是用户输入的整数,以便在两个策略之间做出决定)。程序返回并返回文件结束错误,我尝试将循环的索引更改为I=1,2J=1,3只是为了看看会发生什么,但它会一直返回相同的EoF错误。只有I=1,2J=1,2才会读取文件并保留所有四个条目。我不明白发生了什么。

txt文件的内容,如果有帮助:

10.0 1.0 2.0 3.0 4.0 12.0
1.0 9.0 -1.0 2.0 -3.0 -27.0
2.0 -1.0 7.0 3.0 -5.0 14.0
3.0 2.0 3.0 12.0 -1.0 -17.0
4.0 -3.0 -5.0 -1.0 15.0 12.0

1 个答案:

答案 0 :(得分:3)

命令READ尝试读取整行,然后丢弃它不需要的所有内容。由于您只需按read的单个值阅读,因此您只能读取每行的第一个值,甚至不会将它们存储在正确的变量中。

以下是我的阅读方式:

do i = 1, N
    read(10, *) A(:, i), B(i)
end do

我逐行阅读,将第一个值存储在A行,然后是B(i)中的最后一个值。

更新 @agentp注意到我的上述解决方案是以

的形式读取值
A(1,1) A(2,1) A(3,1) A(4,1) A(5,1) B(1)
A(1,2) A(2,2) A(3,2) A(4,2) A(5,2) B(2)
A(1,3) A(2,3) A(3,3) A(4,3) A(5,3) B(3)
A(1,4) A(2,4) A(3,4) A(4,4) A(5,4) B(4)
A(1,5) A(2,5) A(3,5) A(4,5) A(5,5) B(5)

与您的代码建议您要执行的操作不同:

A(1,1) A(1,2) A(1,3) A(1,4) A(1,5) B(1)
A(2,1) A(2,2) A(2,3) ...
...

要按顺序阅读,您需要将read行更改为:

read(10, *) A(i, :), B(i)

至于你的后续问题:如果你有任何数组A(为了简单起见1D),你可以使用A(3:7)仅访问元素3到7来进行读写。您可以省略从第一个元素到最后一个元素的任何数字:A(:7)表示所有元素,包括索引为7的元素,A(3:)表示所有以索引3开头的元素。

相反,A(:)意味着A的所有元素(如果是1d数组)与仅使用A没有区别。但如果A是多维的,就像它在这里一样,它可能很有用。在这种情况下,我使用了A(:,i),这意味着所有元素都具有第二个索引i

相关问题