Как обрабатывать пробелы в форматированном целочисленном вводе - PullRequest
0 голосов
/ 26 августа 2018

У меня есть такой файл

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

Я получил три нуля для пустой строки.Есть ли варианты для обработки пустого ввода?

1 Ответ

0 голосов
/ 26 августа 2018

Вы можете прочитать каждую строку в символьной переменной и проверить ее скорректированную усеченную длину, если ваша единственная цель - пропустить пустую строку, что-то вроде следующего кода (см. Переменную 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
...