读取无格式流文件时如何检测换行(\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会原封不动读取文件的所有字节,不会自动忽略换行符、制表符这类控制字符。检测不到的原因主要有以下几点,对应解决方法如下:
换行符的平台差异
Windows系统的文本文件换行是\r\n(ASCII码13+10),而非单独的\n;Unix/Linux/macOS系统是\n(ASCII码10),旧版macOS则是\r(ASCII码13)。如果你的检测逻辑只判断\n,就会漏检Windows格式文件里的换行符。检测逻辑需直接对比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确认文件的实际内容
可以用十六进制查看工具验证文件的字节内容:比如Windows用fc /b命令,Linux/macOS用hexdump -C命令,确认文件中是否真的存在你要检测的控制字符。
补充说明:如果使用默认的access='SEQUENTIAL'(顺序读取)模式,Fortran会把文本文件的换行符当作记录分隔符,读取时会自动跳过,这时候才会看不到换行符,但你的代码用了STREAM模式,不存在这个问题。
内容的提问来源于stack exchange,提问作者Flux Capacitor
相关产品推荐
相关产品推荐

