倒数第二个write输出格式有问题。改为 a,5f8.2
事情是这样的:我有40个文件,每个文件里面是一列数字,找出每个文件内数字的最大值。
做法:先将40个文件文件名提取到一个文件中,命名为file1。根据file1的内容,遍历每个文件进行操作,如下:
open(22,file=file1)
open(33,file=file2)!将每个文件的最大值找出放到这个文件内
do i=1,40
read(22,*)file_single
open(44,file=file_single)
max=0
do j=1,line_num!假设file_single的行数已知
read(44,*)num
if(num>max)max=num
enddo
close(44)
write(33,)max
enddo
close(33)
close(22)
结果发生了错误:读取file1时,只有第一行读取出来了,即 i=1 时,read(22,)file_single* 读取正确,当进入第二次循环时,即 i=2 时发生了错误:file_single 没有读出来, 导致程序异常退出。
代码修改如下:
open(22,file=file1)
do i=1,40
read(22,*)file_all(i)
enddo
close(22)
open(33,file=file2)!将每个文件的最大值找出放到这个文件内
do i=1,40
file_single=file_all(i)
open(44,file=file_single)
max=0
do j=1,line_num!假设file_single的行数已知
read(44,*)num
if(num>max)max=num
enddo
close(44)
write(33,)max
enddo
close(33)
以上正确。问题的原因还不清楚。
所以读取文件时,不能图省事。
------------------------------------------------------以上是2022年9月14号前的内容------------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
——————————————————以下是2022年9月14号的内容———————————————————
首先,向大家道歉,出现问题的代码与展示的第一段代码不同,第一段代码是经过简化的代码,而问题就出现在这儿!
其次,感谢 地球屋里老师 的评论,让我重新审视这段代码,非常感谢!
实际出问题的代码如下:
n_in=filelinenum(f_in)!40
open(22,file=f_in) !打开包含一列40个文件名的文件
f_out="max.txt"
open(44,file=f_out) !打开输出文件
do i=1,n_in
write(*,*)i
read(22,*)file_single !读取f_in中的文件
write(*,*)file_single
num_temp=filelinenum(file_single)
max_data=0.0
open(33,file=file_single)
read(33,*)
do j=2,num_temp
read(33,*)real_x,real_temp
if(abs(real_temp)>max_data)then
max_data=abs(real_temp)
max_x=real_x
endif
end do
close(33)
write(44,*)max_x,max_data
end do
close(44)
close(22)
其中子函数 filelinenum 的代码如下,其作用是打开一个文件a,并获取文件行数 filelinenum
integer function filelinenum(a)
integer ios
character a*120
open(22,file=trim(a))
filelinenum=0
do
read(22,*,iostat=ios)
if(ios/=0)exit
filelinenum=filelinenum+1
end do
close(22)
end function filelinenum
这里出现了一个很低级的错误!!!
主程序中打开 f_in 文件的文件号是 22
open(22,file=f_in) !打开包含一列40个文件名的文件
而子函数 filelinenum 中使用的文件号也是 22 ,并且,有关闭的动作:
open(22,file=trim(a))
......
close(22)
也就是说! 文件号 22 在子程序中被关闭了! 直接导致第二次循环读取文件号 22 时出错! 因为已经关闭了呀!
太马虎了!
那么问题来了:
1、子程序又用了一遍文件号 22 ,那么 f_in 是什么状态?内存泄漏?还是关闭了?
显然的是:f_in 没有关闭,且文件号被抢走了,就好像用指针申请了一块儿内存,然后指针被抢走了!从此打开f_in 使用的内存地址找不到了!肯定产生了内存泄漏,但程序结束后,这块内存有没有释放呢?
2、为了避免使用重复的通道号,怎么确定文件号 22 已经被用过了?
暂且想到这些问题,希望经过此处的读者,如果您知道答案,评论区赐教!跪谢!同时本人也将寻找答案!