DDHH 发表于 2023-10-21 09:37:35

彭书上案例复现没成功

data.txt文件
座号:1
中文:1英文:2数学:3
座号:2
中文:3英文:4数学:5

代码:、
module typedef
    type student
      integer chinese,english ,math
    end type
    end module

program ex0907
use typedef
implicit none
type(student)::s
character(len=80)::filename="data.txt"
integer,parameter::fileid=10
logical alive
integer ::error
integer::no

inquire(file=filename,exist=alive)
if(.not.alive)then
    write(*,*)trim(filename),"doesn't exit"
    stop
end if

open (fileid,file=filename)
do while(.true.)
    read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error)no,s
    if(error/=0)exit
    write(*,"(I2'号 中文:'I3'英文:'I3'数学:'I3)")no,s
end do
close(fileid)
stop
end
结果

fcode 发表于 2023-10-21 10:16:33

建议
read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error)no,s
改为
read(fileid,*,iostat=error)no,s

然后文件内容改为:
1 30 50 20
2 13 15 25


DDHH 发表于 2023-10-21 10:36:56

fcode 发表于 2023-10-21 10:16
建议
read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error)no,s
改为


书上为啥操作不了呢?我听网友讲现在一个中文字体代表3个字节,所以5x这里有问题,可是我试了还是没有用

Transpose 发表于 2023-10-21 14:33:32

i3代表数字占三个位置,冒号后面必须长度是3,不足的可以用空格代替 例如
数学:3语文: 2 英语:1

DDHH 发表于 2023-10-21 17:23:06

Transpose 发表于 2023-10-21 14:33
i3代表数字占三个位置,冒号后面必须长度是3,不足的可以用空格代替 例如
数学 ...
data文件调整为
座号: 1
中文:1英文:2数学:3
座号: 2
中文:3英文:4数学:5
代码module typedef
    type student
      integer chinese,english ,math
    end type
    end module
   
program ex0907
use typedef
implicit none
type(student)::s
character(len=80)::filename="data.txt"
integer,parameter::fileid=10
logical alive
integer ::error
integer::no

inquire(file=filename,exist=alive)
if(.not.alive)then
    write(*,*)trim(filename),"doesn't exit"
    stop
end if

open (fileid,file=filename)
do while(.true.)
    read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error)no,s
    if(error/=0)exit
    write(*,"(I2'号 中文:'I3'英文:'I3'数学:'I3)")no,s
end do
close(fileid)
stop
end还是一样的

fcode 发表于 2023-10-21 19:10:23

DDHH 发表于 2023-10-21 10:36
书上为啥操作不了呢?我听网友讲现在一个中文字体代表3个字节,所以5x这里有问题,可是我试了还是没有用 ...

因为格式化读取,对输入文件要求太苛刻,多一个空格,少一个空格都不行。
所以实践中,我几乎不会选择使用格式化读取。

能用 * 表控的,一律用表控。不能用表控的,我会尽可能想办法间接用表控。

fcode 发表于 2023-10-21 19:19:36

DDHH 发表于 2023-10-21 10:36
书上为啥操作不了呢?我听网友讲现在一个中文字体代表3个字节,所以5x这里有问题,可是我试了还是没有用 ...
一个中文有几个字符,与具体的编码有关。并不是固定不变的。
建议不要用格式符读取,直接改用 * 表控格式。
read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error)no,s
改为
character(len=1):: str !//这句放前面定义语句区域
read(fileid,*,iostat=error) str,no,str,s%chinese,str,s%english,str,s%math

文件内容就可以比较自由(空格数量可以不固定,大于等于1个空格即可,座号和冒号:之间不能用空格)
座号:1
中文:1英文:2数学:3

DDHH 发表于 2023-10-23 09:58:23

fcode 发表于 2023-10-21 19:19
一个中文有几个字符,与具体的编码有关。并不是固定不变的。
建议不要用格式符读取,直接改用 * 表控格式 ...

谢谢,但是按照您的代码还是没成功,不知道哪里出问题了

DDHH 发表于 2023-10-23 10:50:30

DDHH 发表于 2023-10-23 09:58
谢谢,但是按照您的代码还是没成功,不知道哪里出问题了

已解决,谢谢各位
页: [1]
查看完整版本: 彭书上案例复现没成功