2015-07-18 3 views
1

Далее вопрос из моего последнего поста: What is this error in fortran and how to stop the program when it occurs?Можно ли ограничить рекурсивное чтение в одной строке?

В моем последнем посте я хочу, чтобы выяснить, как определить ошибку чтения, когда нет входного файла достаточно элементов, которые могут быть решены с помощью IOSTAT в читать заявление.

Мой новый код:

program main 

implicit none 

integer ioerr, switch_1(3), switch_2, i, readerr 

    open(100, FILE='./input_error.gr', ACTION='READ', IOSTAT=ioerr) 

    if (ioerr == 0) then 

    read(100, *, iostat=readerr) (switch_1(i), i=1,3) 
    if(readerr .ne. 0) then 
     write(*,*) 'switch 1 wrong' 
     stop 
    end if 
    write(*,*) 'Switch_1 is: ', switch_1 

    read(100,*,iostat=readerr) switch_2 
    if(readerr .ne. 0) then 
     write(*,*) 'switch 2 wrong' 
     stop 
    end if 
    write(*,*) 'Switch_2 is: ', switch_2 

    else 
    write(*,*) 'File not read' 
    end if 

end program main 

мой входной файл выглядит следующим образом:

1,2,3 
1 

Мой новый вопрос, когда есть меньше трех элементов в первой строке, программа автоматически читать элементы в следующей строке для Switch_1, а Switch_2 не будет читать и, поскольку программа закодирована, она вернет «Switch 2 wrong». Например, когда вход так:

1,3 
2 

Однако, что на самом деле не так это switch_1. Поскольку для switch_1 недостаточно элементов, он переходит к следующей строке, заполняя последнюю позицию массива. Это не то, что я хочу. Я хочу ограничить чтение в одной строке, поэтому программа не будет читать другую строку автоматически, и в этом случае программа может остановиться на switch_1 и дать мне «Switch 1» неправильно. Является ли это возможным?

+2

Как это отличается от http://stackoverflow.com/questions/31464930/what-is-this-error-in-fortran-and-how-to-stop-the-program-when-it-occurs? Вы должны ссылаться на свой предыдущий вопрос и объяснять разницу, иначе вы рискуете закрыть и downvoting. –

+0

Также объясните, какую ошибку вы видите. Печатает ли что-нибудь? Является ли результат неправильным? –

+0

Спасибо, я добавлю более подробную информацию по своим вопросам – user3716774

ответ

1

Обычно я решаю эту проблему, сначала читая строку в строку, а затем пытаюсь читать числа из строки. Например,

character(len=200) :: str ! Long enough to hold a whole line 
integer :: i(3), ier, fid 

fid = 100 
open(fid, FILE='./input_error.gr', ACTION='READ') 

! -- Read a *single* line, and put it all into str 
read(fid,'(a)') str 

! -- Read str into integer array i 
read(str,*,iostat=ier) i(1:3) 

! -- Check if the line actually contained 3 integers 
if (ier /= 0) then 
    write(*,*) 'Unsuccessful read' 
endif 

Оператор чтения, поэтому только в состоянии использовать текущую строку, потому что все str содержит.

+0

Большое спасибо за ответ! Это полезно, но я думаю, что это слишком сложно, когда программа становится больше. Еще раз спасибо, но – user3716774

+0

Какие еще цели вы ищете от исправления? Мое предлагаемое решение добавляет только одну дополнительную строку для каждого обычного вызова для чтения. – Ross

+0

Я понимаю, что если программа только для обработки чисел, добавление комментариев во входной файл может решить мою проблему. Но я не уверен, что произойдет, когда я столкнусь с ввод строки символов.Возможно, мне придется использовать ваш подход в этом случае. Я просто хочу, чтобы код был как можно более простым – user3716774

0

Я понимаю, что если я добавлю комментарий в конце каждой строки, так как символ a - это другой тип данных, он не будет считаться целым числом. Преимущество состоит в том, что для каждого коммутатора недостаточно элементов, программа сначала прочитает комментарий, а не прочитает следующую строку и даст правильное сообщение об ошибке.

Например, чтобы входной сигнал, как:

1,2,3   ! Switch 1 
4    ! Switch 2 

с этой структурой, даже если нет достаточного количества входных элементов для переключателя 1, он не читает 4 в качестве третьего элемента, вместо этого, он читает комментарий «! Switch 1», который обязательно вернет ошибку для Switch 1. Это именно то, что я хочу, и это отлично работает с процедурами чтения номера. Однако, если тип данных switch_1 является символом в начале, что произойдет? Он не останавливается на цифрах.

Смежные вопросы