fortran运行时出现乱码

img


fortran运行时,本来要输出的数字变成了乱码,这是为什么,求指点

倒数第二个write输出格式有问题。改为 a,5f8.2

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7571867
  • 这篇博客也不错, 你可以看下fortran生成随机数
  • 除此之外, 这篇博客: 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 已经被用过了?
    暂且想到这些问题,希望经过此处的读者,如果您知道答案,评论区赐教!跪谢!同时本人也将寻找答案!