Fortran从fie读入数组

时间:2015-10-13 14:59:45

标签: fortran fortran90

我需要从txt文件中读取三个数组,以便计算坐标之间的距离。我已经查看了其他答案并将脚本拼凑在一起。输入文件的列需要分别来自我的x,y和z数组。每个条目有64行和16个小数位。指针将不胜感激。

数据格式:

0.8607595188703266  0.9252035918116585  0.4094258340665792
  0.5246038490998378  0.9804633529144733  0.5325820695466118
  0.6955271184611949  0.3304908806613460  0.7154502550542654
到目前为止

和我的剧本:

PROGRAM readtest

use, intrinsic :: iso_fortran_env

implicit none

integer, parameter :: ArrayLen = 64
real(real64), DIMENSION(ArrayLen) :: x
real(real64), DIMENSION(ArrayLen) :: y
real(real64), DIMENSION(ArrayLen) :: z
integer :: i, ReadCode, num



OPEN(1, FILE='contcar.txt', STATUS='old', ACTION='read')
OPEN(2, FILE='xyz.txt', STATUS='replace', ACTION='write')

num = 0
ReadLoop: do i=1, ArrayLen

   read (1, '(A,F18.16)', iostat=ReadCode ) x(i), y(i), z(i)

   if ( ReadCode /= 0 ) then
      if ( ReadCode == iostat_end ) then
         exit ReadLoop
      else
         write ( *, '( / "Error on read: ", I0 )' )  ReadCode
         stop
      end if
   end if

   num = num + 1

end do ReadLoop

WRITE(3, 100) x, y, z
100 format (A,F18.16)

END PROGRAM readtest

xyz.txt显示为空白,我在这个阶段没有收到任何错误,这里有什么错误,就是停止数组填充并写入文件? 对不起,如果这是太多的混乱接近,任何帮助将不胜感激。 感谢

1 个答案:

答案 0 :(得分:0)

您遇到两个问题:

  • 您的格式规范错误
  • 你的写作不会做你想做的事

首先,格式A,F18.16读取两个项目,一个字符和一个浮点数。你想要的是读取3个浮点数。提供文件后,每个数字前面有两个空格,因此您可以使用

read (1, '(3(2X,F18.16))', iostat=ReadCode ) x(i), y(i), z(i)

但如果您的输入格式发生变化并且更容易进行列表导向输入,则这不是很灵活:

read (1, *, iostat=ReadCode ) x(i), y(i), z(i)

将执行您想要的操作,并且对文件中数字的确切位置以及存在多少个插入空间不敏感。

这会将您的数据加载到数组中。现在输出你想要同样的东西。您想要复制输出,以便我们可以使用第一种格式来规定输出(3(2X,F18.16))。这将在每行输出3个数字,每个数字前有2个空格。下一个问题是你正在尝试

WRITE(3, 100) x, y, z

将转置你的数组。它会写出所有x,然后是y的所有内容,最后是z的全部内容。如果您想要相同的输出,请将其置于循环中。将上述内容放在一起,使用:

do i=1, ArrayLen
   WRITE(2, 100) x(i), y(i), z(i)
end do
100 format (3(2X,F18.16))

请注意,不要使用单个数字的单元号,特别是前几个与大多数编译器上的系统定义的标准输入/输出/错误单元冲突。