我需要从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显示为空白,我在这个阶段没有收到任何错误,这里有什么错误,就是停止数组填充并写入文件? 对不起,如果这是太多的混乱接近,任何帮助将不胜感激。 感谢
答案 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))
请注意,不要使用单个数字的单元号,特别是前几个与大多数编译器上的系统定义的标准输入/输出/错误单元冲突。