我试图在我的矩阵数组中提取一个文本文件中的特定元素,它似乎并没有提取我想要的元素。 这是我正在使用的代码
real :: a
open(unit=2,file='matrix.txt',status='old', form= 'formatted', action='read', &
iostat=io_error)
if ( io_error == 0) then
read(2,100) a
100 format(1x,2/,E8.1)
write(*,*) 'a', a
else
write(*,*) 'unable to open file', &
io_error,' failed'
end if
close(unit=2)
以下是我拥有的值
-1.000000e-001 -55.000000e+000 2
-2.000000e-001 -7.000000e-001 8
-3.000000e-001 0.000000e+000 5
-4.000000e-001 5.000000e-001 17
我想输出第3行第2列中的元素。 这甚至可能吗?
但是当我运行代码时,我得到-2。
在从这样的文件中读取元素时,是否还有其他方法可以隔离元素?我宁愿不把它读成虚拟变量。
答案 0 :(得分:1)
当然有可能,你需要一个不同的格式,你想要第三行,而不是右列,并读取一个正确宽度的实数。
open(newunit=iu, ,file='matrix.txt',status='old', form= 'formatted', action='read', &
iostat=io_error)
...
read(iu, '(2/,t16,e14.0)', iostat=io_error) a
这会跳过两个记录,转到第16列并读取一个14个字符宽的实数。检查列号是否正确。你总是希望.0
输入实数,否则会发生奇怪的事情(在这里用其他Q / A处理)。
而不是2/
,您可以执行两次read(iu, *)
。
您可以使用newunit=iu
这样的固定数字代替unit=iu
和unit=11
,以实现向后兼容。
答案 1 :(得分:0)
如果你想了解它,我会推荐一种三管齐下的方法
1)阅读:E8.1可能是正确的,但它看起来更像是E8.5或1PE12.5,但你不需要它。还会在阅读中发生什么......?它是标量a中的第一个,第二个还是第三个数字?
我没有编译它,因此它仅作为概念性示例提供。
real :: a, b
Integer :: c
open(unit=22,file='matrix.txt',status='old', form= 'formatted', action='read', &
iostat=io_error)
if ( io_error == 0) then
read(22,*) a, b, c
100 format(1x,2/,E8.1)
write(*,*) 'a=',a,' b=',b,' c=',c
else
write(*,*) 'unable to open file', &
io_error,' failed'
end if
close(unit=22)
2)数组:您提到了第三行和第二行/列。
real, dimension(3,100) :: a
Integer :: I = 0
open(unit=22,file='matrix.txt',status='old', form= 'formatted', action='read', &
iostat=io_error)
if ( io_error == 0) then
I = I + 1
read(22,*) a(:, I)
100 format(1x,2/,E8.1)
write(*,*) 'a(:,',I,')', a(:, I)
else
write(*,*) 'unable to open file', &
io_error,' failed'
end if
close(unit=22)
3)格式和Newunit :尝试使用Vladimir的新单元以及格式化的读取。 (通常我使用未格式化的读取和格式化写入)