【问题标题】:How to handle blank in formatted integer input如何处理格式化整数输入中的空白
【发布时间】:2018-08-26 09:42:25
【问题描述】:

我有一个这样的文件

1980  01  23 

1982  04  30
1983  05  22
1984        
1985  02  11

我尝试使用“(3I4)”格式读取数据

implicit none

integer, parameter :: FUnitIn = 10
character(len=255) :: FNameIn = "./test.txt"


integer :: FStatOpen, FStatRead
integer :: yyyy, mm, dd


open ( unit    = FUnitIn, &
       file    = trim(FNameIn), &
       access  = "sequential", &
       form    = "formatted", &
       status  = "old", &
       iostat  = FStatOpen)
if (FStatOpen /= 0) then ! ERROR
    stop
end if


do
    read (FUnitIn, "(3I4)", iostat=FStatRead) yyyy, mm, dd
    if (FStatRead /= 0) then
        exit
    else
        write (6, "(3I4)") yyyy, mm, dd
    end if
end do

我得到三个零作为空白行。 是否有任何选项可以处理空白输入?

【问题讨论】:

  • 欢迎提供详细信息。阅读How to AskMinimal, Complete, and Verifiable example
  • 当阅读中有空白条目时,您希望发生什么?
  • 我的意思是显而易见的答案是检查零。毕竟没有年月日0。或者你可以把它读成一个临时字符串,然后你可以分析这个字符串,看看它是否有效,然后才从字符串中读取到值。

标签: fortran fortran90 formatted-input


【解决方案1】:

如果您的唯一目标是跳过空行,您可以读取字符变量中的每一行,并检查其调整后的长度,类似于以下代码(参见变量record)。除了这个简单的实现之外,您还需要一些额外的信息来确定您想要获得什么行为。

implicit none

integer, parameter  :: FUnitIn = 10
character(len=255)  :: FNameIn = "./test.txt"


integer             :: FStatOpen, FStatRead
integer             :: yyyy, mm, dd
character(len=1023) :: record


open ( unit    = FUnitIn, &
    file    = trim(FNameIn), &
    access  = "sequential", &
    form    = "formatted", &
    status  = "old", &
    iostat  = FStatOpen)
if (FStatOpen /= 0) then ! ERROR
    stop
end if


do
    read (FUnitIn, "(3I4)", iostat=FStatRead) record
    if (FStatRead /= 0) then
        exit
    elseif ( len_trim(adjustl(record)) > 0 ) then
        read (record, *) yyyy, mm, dd            
        write (6, "(3I4)") yyyy, mm, dd
    end if
end do

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-12
    • 2016-06-18
    • 2019-11-07
    • 2020-06-27
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多