我有一个名为" test.dat"的文件。包含10x6矩阵如下:
test.dat文件的内容:
2 5 9 0 0 0
1 3 7 6 0 0
0 0 0 0 0 0
0 0 0 0 0 0
1 0 0 0 0 0
0 0 0 0 0 0
4 6 0 0 0 0
3 0 0 0 0 0
2 1 0 0 0 0
0 0 0 0 0 0
我想将此矩阵转换为10x10矩阵,其内容如下:
所需的test1.dat文件的内容:
0 1 0 0 1 0 0 0 1 0
1 0 1 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
test1.dat是一个10x10矩阵,其中包含由此方法构造的行:例如,文件test1.dat的第1行0 1 0 0 1 0 0 0 1 0
实际上是文件test.dat的第1行,2 5 9 0 0 0
,如果不同,它的长度从6变为10,其i
元素(在test.dat的第一行中显示)被1
取代。即test.dat的第一行实际上表示该行应扩展为10个元素,其第2,第5和第9个元素应替换为" 1"其余的零
要将test.dat(矩阵A(10x6))转换为test1.dat(矩阵B(10x10)),我必须首先逐元素地读取每行test.dat,例如" j"第一行,如果它的元素等于例如" z",我写b(j,z)=1
(B' s(j,z)元素)。到目前为止,我只能尝试阅读" A",元素依次如下:
program test1 Integer (kind=8) :: c integer (kind = 8) :: g, h INTEGER, DIMENSION(10,6) :: z open (unit=20, file="test.dat", access="sequential", form="formatted") do g=1,6 Read(20,*) z write (*, *) z end do end program test1
这段代码将逐个元素地读取每一行,并将其写入。我对吗?但是我得到以下运行时错误:
文件test1.f90的第7行(单位= 20,文件=' test.dat')
Fortran运行时错误:文件结束
现在我的问题是:
- 这段代码是否正确?
- 我收到上述错误的代码有什么问题?
- 如何实现其他程序以获取" test1.dat文件"?
醇>
如果有人帮助我,我感激不尽。
P.S。机器信息:
" Linux 3.16.6-200.fc20.x86_64(fedora 20)"
" gcc版本4.8.3 20140911(红帽4.8.3-7)(GCC)"
"使用.f90"
答案 0 :(得分:0)
不,代码不正确。考虑循环
do g=1,6
Read(20,*) z
write (*, *) z
end do
尝试将z
的所有60个元素读取6次。文件中没有足够的数字,运行时系统在完成之前会遇到文件的末尾 - 结果是您观察到的结果。
逐行读取文件的一种简单方法是修改循环,如下所示:
do g=1,10
Read(20,*) z(g,:)
write (*, *) z(g,:)
end do
此版本一次只读取一行z
。
在你提出下一个问题之前,花点时间研究这种简单的例行程序。在这里有几个近乎重复的问题,你可以从中找出问题,并自己修复它们。