我正在编写一个FORTRAN程序,它从文本文件中读取数据并将其写入控制台。数据文件看起来像这样
1234567890123456 123456.789 987654.321 673647.890 654356.890
6172876534567890 768909.098 234543.890 654321.908 987890.090
我有以下FORTRAN代码行,它们读取数据并将它们写入控制台
OPEN(1,FILE='data.txt')
READ(1,'(I16,3F9.3)') A ,B, C, D
WRITE (*, '(I16,3F9.3)') A,B,C,D
CLOSE(1)
以下是输出
,而不是在文本文件中显示为相同的值1234567890123456*********89987.656 0.322
6172876534567890*********98234.547 0.891
你能帮我解决这个问题。
非常感谢
答案 0 :(得分:8)
列表导向的IO(即*)更容易,特别是在输入时。然而,有时候使用完整的IO控制以便值得理解。在输入时,数据项和描述符必须按列排列。对于输入,在Fw.d中,如果数据项中有小数点,则d无关紧要。输入和输出的字段必须足够宽。需要有足够的描述符,其中包含与变量和数据项匹配的类型。与此示例程序比较:
program test_read
implicit none
integer, parameter :: VLI_K = selected_int_kind (18)
integer, parameter :: DR_K = selected_real_kind (14)
integer (VLI_K) :: i
real (DR_K) :: a, b, c, d
open (unit=15, file="data.txt", status='old', &
access='sequential', form='formatted', action='read' )
read (15, 110) i, a, b, c, d
110 format (I16, 4(1X, F10.0) )
write (*, 120) i, a, b, c, d
120 format ( I18, 4 (2X, F12.3) )
read (15, *) i, a, b, c, d
write (*, 120) i, a, b, c, d
end program test_read
答案 1 :(得分:3)
我有过最艰难的时间尝试使用阅读,但最后...... 如果要读取存储在.txt文件中的矩阵,请使用以下命令:
program FILEREADER
real, dimension(:,:), allocatable :: x
integer :: n,m
open (unit=99, file='array.txt', status='old', action='read')
read(99, *), n
read(99, *), m
allocate(x(n,m))
do I=1,n,1
read(99,*) x(I,:)
write(*,*) x(I,:)
enddo
end
例如,“array.txt”文件必须与此类似(并放在main的同一文件夹中):
4
3
0.0 1.0 2.0
3.0 4.0 5.0
6.0 7.0 8.0
9.0 10.0 11.0
希望它适用于那里的所有人
答案 2 :(得分:2)
我使用固定格式,因为编辑和检查具有固定列结构的输入文件比zigzag数据更容易。
我的问题是Fortran运行时读者程序如何解释小数点的存在和不存在。我不确定我的解决方案是最好的,但我将数据行读作字符数组,将它们拆分为长度为12个字符的字段,然后我按read(*)
语句读取字段。
答案 3 :(得分:1)
原因是您指定的宽度对于实数来说太小了。通常当宽度不合适时,fortran会显示星号,这种情况会发生在你的情况下。
你有9个数字,但是你需要至少10个,因为逗号也会占用一列。 因此,用3F10.3替换3F9.3应该可以解决问题。
答案 4 :(得分:1)
轻微修改@ AndrésArgüelloGuillén的答案。
与大多数其他解决方案不同,我的代码不会强制您提前指定行数和列数。
CHARACTER(128) :: buffer
integer strlen, rows, cols
real, dimension(:,:), allocatable :: x
OPEN (1, file = 'matrix.txt', status='old', action='read')
!Count the number of columns
read(1,'(a)') buffer !read first line WITH SPACES INCLUDED
REWIND(1) !Get back to the file beginning
strlen = len(buffer) !Find the REAL length of a string read
do while (buffer(strlen:strlen) == ' ')
strlen = strlen - 1
enddo
cols=0 !Count the number of spaces in the first line
do i=0,strlen
if (buffer(i:i) == ' ') then
cols=cols+1
endif
enddo
cols = cols+1
!Count the number of rows
rows = 0 !Count the number of lines in a file
DO
READ(1,*,iostat=io)
IF (io/=0) EXIT
rows = rows + 1
END DO
REWIND(1)
print*, 'Number of rows:', rows
print*, 'Number of columns:', cols
allocate(x(rows,cols))
do I=1,rows,1
read(1,*) x(I,:)
write(*,*) x(I,:)
enddo
CLOSE (1)
<强> matrix.txt 强>
0.0 1.0 2.0
3.0 4.0 5.0
6.0 7.0 8.0
答案 5 :(得分:0)
通常以非固定格式读取数据会更好。并留下一些前导空格,以便在写出数字时适合数字。
integer(8) :: i
real(4) :: x, y, z
open(unit=1, file='data.txt')
read(1,*)i, x, y, z
write(*,'(i16, 3f11.3)')i, x, y, z
end