You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:35:17