Fortran 95如何读取行尾空白字符并判断实际行长度?
解决Intel Fortran 95读取带行尾空白文本行的问题
针对你遇到的问题,核心是固定长度A格式会自动填充空白到指定长度,无法区分原行的尾空白和填充空白,以下是几种可行的解决方法:
方法1:利用SIZE参数获取实际读取长度(Intel Fortran推荐)
Intel Fortran支持READ语句的SIZE扩展参数,能直接返回该行实际的字符数(包括行尾空白)。修改读取代码如下:
character*(*) line integer :: actual_len ! 用(A)格式读取整行,SIZE参数获取实际字符数 read(unit=11, '(A)', SIZE=actual_len) line ! 此时actual_len就是原行的真实长度(含尾空白) ! 原行内容为 line(1:actual_len),后续为填充的空白
注意不要使用固定长度的(A80)格式,改用无长度限制的(A)让编译器自动适配行内容。
方法2:通过INQUIRE获取记录长度
先查询当前记录的长度,再读取对应长度的内容,适合需要精确控制读取长度的场景:
character*(*) line integer :: rec_len, ios ! 查询当前记录的长度 inquire(unit=11, RECLEN=rec_len, IOSTAT=ios) if (ios == 0) then ! 根据记录长度构建格式字符串,读取对应内容 read(unit=11, '(A'//trim(str(rec_len))//')') line ! line(1:rec_len)即为原行完整内容(含尾空白) endif
注:str函数用于将整数转换为字符串,若编译器未内置,可自行实现简易版本。
方法3:逐字符读取计数(兼容性最强)
如果依赖编译器扩展的方法不可用,可通过逐字符读取并计数的方式获取完整内容:
character*(*) line character :: char integer :: idx, ios idx = 0 do idx = idx + 1 ! 逐字符读取,ADVANCE='NO'避免换行 read(unit=11, '(A1)', ADVANCE='NO', IOSTAT=ios) char ! 遇到IO状态异常(如行尾、文件结束)则退出 if (ios /= 0) exit line(idx:idx) = char enddo ! idx-1为原行实际长度,line(1:idx-1)是完整原行内容
该方法不依赖任何编译器扩展,适用于所有Fortran 95环境。
内容的提问来源于stack exchange,提问作者Mikko T
相关产品推荐
相关产品推荐

