fortran读文本文件--汉字问题

最近在学习fortran,参考教材是彭国伦的《Fortran95程序设计》,感觉写得不错。今天看到文件部分,想实现从文本文件中读取数据到数组中。

要读取的数据存在一个叫data.txt的文本文件中,数据内容如下:


教材中例子的代码如下,注释是我自己加上去的:

!定义模块,里面的type所fortran自定义的数据类型,类似c语言中的结构体
!下面的代码所定义了一个名为student的type数据,里面有3个成员,分别来记录3门功课成绩 
module typedef
 type student
  integer Chinese,English,Math
 end type
end module


program tst
!使用上面定义的模块
 use typedef
 implicit none
 type(student)::s

!定义变量
 character(len=80)::filename="data.txt"
 integer,parameter::fileid=10
 integer::error
 integer::no
 logical::alive

!检查文件是否存在,若不存在就退出程序
 inquire(file=filename,exist=alive)
 if(.not. alive) then
  write(*,*) trim(filename),"doesn't exist."
  stop
 end if

!打开文件
 open(fileid,file=filename)
  do while(.true.)
   !下面开始读数据,nX表示跳过n个字符,过滤不需要的数据,把座号和成绩分别赋给no和s数组
   read(fileid,"(5XI2,/,5XI3,6XI3,6XI3)",iostat=error) no,s
  !error不为0表示读取过程中出错,退出程序   
   if(error/=0) exit
  !将读取的数据显示在屏幕上
   write(*,"(I2'号 中文:'I3' 英文:'I3' 数学:'I3)") no,s
  end do
 close(fileid)

 stop
end
其中最重要的就是read语句了,fileid用来指定要读取数据的文件代码,后面“()”里的部分是读取的格式,具体的含义为:

跳过5个字符读取2个字节,换行,跳过5个字符读取3个字节,跳过6个字符读取3个字节,跳过6个字符读取2个字节。

教材上说一个汉字占2个字符,所以2个汉字加一个冒号就是5个字符,跳过5个字符就是我们需要的数据了,但是我在codeblocks下面运行什么都没有输出。调试了一下发现no(座号)为0,s数组里是随机数,error不为0,说明读取过程中出错直接退出了,所以屏幕上什么都没有。

考虑到可能是汉字的原因,我把data文件中的汉字去掉换成英文的:


把read一行改成下面这样:

read(fileid,"(3XI2,/,8XI3,8XI3,5XI3)",iostat=error) no,s
然后运行就能正确输出结果了:


看来果然是因为汉字。我一直以为1个汉字占2个字符,这个认识已经根深蒂固了。我查了一下,这个是因为字符编码的问题,比如UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,它使用一至四个字节为每个字符编码:

  1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
  2. 带有附加符号的拉丁文、希腊文、希伯来文、阿拉伯文等则需要二个字节编码(Unicode范围由U+0080至U+07FF)。
  3. 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字)使用三个字节编码。
  4. 其他极少使用的Unicode辅助平面字符使用四字节编码。

按照上面说的一个汉字应该占3个字符,那么把read命令改成下面这样:

read(fileid,"(7XI2,/,7XI3,7XI3,7XI3)",iostat=error) no,s

再编译运行一下就能输出跟上面一样的结果了。


PS. CSDN编辑博客真不方便!


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值