Fortran Coder

标题: Fortran90彭国伦书上问题有错 [打印本页]

作者: LUFFY56    时间: 2024-6-27 09:52
标题: Fortran90彭国伦书上问题有错
[Fortran] 纯文本查看 复制代码
module typedef
   type player
        character(len=80) :: name
        real weight,height
        real score
   end type
end module

program ex0902
    use typedef
    implicit none
    character(len=20) :: filename = "text.txt"
    integer,parameter :: fileid = 20
    logical :: alive    ! 检查文件是否存在
    type(player) :: p   ! 读取选手数据
    character(len=10) :: title  ! 读取数据项
    real tempnum    ! 读取数据
    logical,external :: GetNextPlayer   ! 找出下一位球员数据的函数
    integer i   ! 循环计数器
    integer error   !检查文件读取是否正常

    inquire(file=filename,exist=alive)
    if(.not. alive) then    ! 文件不存在就结束程序
        write(*,*)trim(filename)," doesn;t exist."
        stop
    end if

    open(unit=fileid,file=filename)
    do while(.true.)
        if(GetNextPlayer(fileid,p%name))then
            do i=1,3
                read(fileid, "(A4,1X,F)",iostat=error) title,tempnum
                if(error /= 0) then
                    write(*,*)"文件读取错误"
                    stop
                end if
                ! 要经过每一行最前面两个中文来判断读入的是什么数据
                select case(title)
                case("身高")
                    p%height = tempnum
                case("体重")
                    p%weight = tempnum
                case("得分")
                    p%score = tempnum
                case default
                    write(*,*)"出现不正确数据"
                    stop
                end select
            end do
        else
            exit    ! 没有数据了,离开循环
        end if
        if(p%score > 20.0) then ! 显示得分高于20分的选手数据
            write(*,"('姓名:'A8/,'身高:'F5.1,' 体重:'F5.1,' 得分:'F4.1)")p
        end if
    end do
    stop
end program
!GetNextPlayer函数会从文件中找出下一位球员的数据位置
!如果文件中还有数据需要读取,返回.true.
!如果文件中没有数据需要读取,返回.false.

logical function GetNextPlayer(fileid,name)
    implicit none
    integer,intent(in) :: fileid
    character(len=*),intent(out) :: name
    character(len=80)title
    integer error

    do while(.true.)
        read(fileid,"(A80)",iostat=error) title

        if(error /= 0) then ! 文件中已经没有数据了
            GetNextPlayer = .false.
            return
        end if

        if(title(1:4) == "姓名")then
            name = title(6:)
            GetNextPlayer = .true.
            return
        end if
    end do
    return
end function

显示报错,下面这句代码有啥问题
read(fileid, "(A4,1X,F)",iostat=error) title,tempnum
D:\fortran project\test\main.f90|32|Error: Nonnegative width required in format string  |


作者: fcode    时间: 2024-6-27 11:24
这属于语法未定义操作。

彭国伦用的编译器允许这种操作,而你用的 gfortran 不允许。这是很正常的,gcc和msvc以及clang尚且有很多细节行为不同。

改成
read(fileid, *,iostat=error) title,tempnum
就行了
作者: weixing1531    时间: 2024-6-27 12:21
输入时尽量用表控输入,容错性好
作者: LUFFY56    时间: 2024-6-27 12:59
fcode 发表于 2024-6-27 11:24
这属于语法未定义操作。

彭国伦用的编译器允许这种操作,而你用的 gfortran 不允许。这是很正常的,gcc和m ...

但是输出中文会乱码的,是不是要加UTF-8格式,其他语言我会,fortran语法不太会
作者: fcode    时间: 2024-6-27 21:12
中文乱码一般是编码问题导致的。没有统一的解决方案,与你使用的平台和环境有关。
总之就是,数据来源(如果是源码里写的,那就是源码的编码。如果从文件里读取的,那就是数据文件的编码),必须与你显示的环境(终端显示则是终端的字符编码设置)一致。


如果你不是做商业软件,仅仅是自己学习和编程计算一些学科上的需求。
那就只用英文就行了,没有什么必要非要使用中文。






欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2