Fortran Coder

查看: 1205|回复: 4
打印 上一主题 下一主题

[读物] Fortran90彭国伦书上问题有错

[复制链接]

6

帖子

2

主题

0

精华

入门

F 币
34 元
贡献
14 点
跳转到指定楼层
楼主
发表于 2024-6-27 09:52:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01module typedef
02   type player
03        character(len=80) :: name
04        real weight,height
05        real score
06   end type
07end module
08 
09program ex0902
10    use typedef
11    implicit none
12    character(len=20) :: filename = "text.txt"
13    integer,parameter :: fileid = 20
14    logical :: alive    ! 检查文件是否存在
15    type(player) :: p   ! 读取选手数据
16    character(len=10) :: title  ! 读取数据项
17    real tempnum    ! 读取数据
18    logical,external :: GetNextPlayer   ! 找出下一位球员数据的函数
19    integer i   ! 循环计数器
20    integer error   !检查文件读取是否正常
21 
22    inquire(file=filename,exist=alive)
23    if(.not. alive) then    ! 文件不存在就结束程序
24        write(*,*)trim(filename)," doesn;t exist."
25        stop
26    end if
27 
28    open(unit=fileid,file=filename)
29    do while(.true.)
30        if(GetNextPlayer(fileid,p%name))then
31            do i=1,3
32                read(fileid, "(A4,1X,F)",iostat=error) title,tempnum
33                if(error /= 0) then
34                    write(*,*)"文件读取错误"
35                    stop
36                end if
37                ! 要经过每一行最前面两个中文来判断读入的是什么数据
38                select case(title)
39                case("身高")
40                    p%height = tempnum
41                case("体重")
42                    p%weight = tempnum
43                case("得分")
44                    p%score = tempnum
45                case default
46                    write(*,*)"出现不正确数据"
47                    stop
48                end select
49            end do
50        else
51            exit    ! 没有数据了,离开循环
52        end if
53        if(p%score > 20.0) then ! 显示得分高于20分的选手数据
54            write(*,"('姓名:'A8/,'身高:'F5.1,' 体重:'F5.1,' 得分:'F4.1)")p
55        end if
56    end do
57    stop
58end program
59!GetNextPlayer函数会从文件中找出下一位球员的数据位置
60!如果文件中还有数据需要读取,返回.true.
61!如果文件中没有数据需要读取,返回.false.
62 
63logical function GetNextPlayer(fileid,name)
64    implicit none
65    integer,intent(in) :: fileid
66    character(len=*),intent(out) :: name
67    character(len=80)title
68    integer error
69 
70    do while(.true.)
71        read(fileid,"(A80)",iostat=error) title
72 
73        if(error /= 0) then ! 文件中已经没有数据了
74            GetNextPlayer = .false.
75            return
76        end if
77 
78        if(title(1:4) == "姓名")then
79            name = title(6:)
80            GetNextPlayer = .true.
81            return
82        end if
83    end do
84    return
85end function

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

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2024-6-27 11:24:07 | 只看该作者
这属于语法未定义操作。

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

改成
read(fileid, *,iostat=error) title,tempnum
就行了

156

帖子

45

主题

1

精华

宗师

F 币
1368 元
贡献
649 点
板凳
发表于 2024-6-27 12:21:23 | 只看该作者
输入时尽量用表控输入,容错性好

6

帖子

2

主题

0

精华

入门

F 币
34 元
贡献
14 点
地板
 楼主| 发表于 2024-6-27 12:59:25 | 只看该作者
fcode 发表于 2024-6-27 11:24
这属于语法未定义操作。

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

但是输出中文会乱码的,是不是要加UTF-8格式,其他语言我会,fortran语法不太会

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

5#
发表于 2024-6-27 21:12:09 | 只看该作者
中文乱码一般是编码问题导致的。没有统一的解决方案,与你使用的平台和环境有关。
总之就是,数据来源(如果是源码里写的,那就是源码的编码。如果从文件里读取的,那就是数据文件的编码),必须与你显示的环境(终端显示则是终端的字符编码设置)一致。


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

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-4 15:17

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表