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

来源:互联网 发布:简品花果茶淘宝 编辑:程序博客网 时间:2024/06/07 14:12

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

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


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

!定义模块,里面的type所fortran自定义的数据类型,类似c语言中的结构体!下面的代码所定义了一个名为student的type数据,里面有3个成员,分别来记录3门功课成绩 module typedef type student  integer Chinese,English,Math end typeend moduleprogram 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) stopend
其中最重要的就是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编辑博客真不方便!