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

读取无格式流文件时如何检测换行(\n)或制表符(\t)?

Fortran读取文件时无法检测换行符/制表符的问题解决

我通过以下Fortran代码将文件读取到字符字符串中:

character*50, intent(in) :: flname
character(len=:), allocatable :: str
integer size

inquire(file=flname, size=size)  
allocate(character(len=size)::str)               

open(1, file=flname, status='OLD', access='STREAM') 
read(1) str
close(1)

我尝试遍历该字符字符串以检测特定字符,包括换行符('\n')或制表符('\t'),但无法在文件中检测到这些字符。请问Fortran是否会自动忽略这些字符?若如此,该如何设置才能检测到它们?


你的代码采用了access='STREAM'模式,这种模式下Fortran会原封不动读取文件的所有字节,不会自动忽略换行符、制表符这类控制字符。检测不到的原因主要有以下几点,对应解决方法如下:

  1. 换行符的平台差异
    Windows系统的文本文件换行是\r\n(ASCII码13+10),而非单独的\n;Unix/Linux/macOS系统是\n(ASCII码10),旧版macOS则是\r(ASCII码13)。如果你的检测逻辑只判断\n,就会漏检Windows格式文件里的换行符。

  2. 检测逻辑需直接对比ASCII值
    遍历字符串时,建议通过achar()函数直接对应控制字符的ASCII码来判断,避免字符转义的问题,示例代码如下:

    do i = 1, len(str)
      select case(str(i:i))
        case(achar(9))  ! 制表符\t的ASCII码是9
          print *, "找到制表符,位置:", i
        case(achar(10)) ! 换行符\n的ASCII码是10
          print *, "找到换行符,位置:", i
        case(achar(13)) ! 回车符\r的ASCII码是13
          print *, "找到回车符,位置:", i
      end select
    end do
    
  3. 确认文件的实际内容
    可以用十六进制查看工具验证文件的字节内容:比如Windows用fc /b命令,Linux/macOS用hexdump -C命令,确认文件中是否真的存在你要检测的控制字符。

补充说明:如果使用默认的access='SEQUENTIAL'(顺序读取)模式,Fortran会把文本文件的换行符当作记录分隔符,读取时会自动跳过,这时候才会看不到换行符,但你的代码用了STREAM模式,不存在这个问题。


内容的提问来源于stack exchange,提问作者Flux Capacitor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:22:40