fortran读取文件内容

关于 fortran 读取文件的注意事项(嵌套读取)

事情是这样的:我有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 已经被用过了?
暂且想到这些问题,希望经过此处的读者,如果您知道答案,评论区赐教!跪谢!同时本人也将寻找答案!

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张立宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值