2016-11-27 21 views
1

У меня есть файл данных с 84480 строк, я разбил их на 20 разных файлов в подпрограмме, каждая из которых имеет 4224 строки. Теперь я хочу использовать эти файлы один за другим в другой подпрограмме и сделать некоторый анализ. Но когда я попытался, я получаю ошибку времени выполнения: конец файла.Ошибка выполнения: Конец файла

Вот структура основной программы

real (kind = 8) :: x(84480),y(84480),x1(4424),y1(4424) 
open(1000,file='datafile.txt',status='old') 
n = 20   ! number of configurations 
m = 84480  ! total number of lines in all configurations 
p = 4224  ! number of lines in a single configuration 
no = 100  ! starting file number configurations 
do i=1,m 
    read(1000,*) x(i),y(i) 
end do 
call split(x,y,m,n) 
do i = 1,20 
    open(no) 
    do j = 1,p 
     read(no,*) x1(j),y1(j) ! error is occurring in here 
    end do 
    no = no + 1 
end do 
end 

Вот подпрограмма

subroutine split(x,y,m,n) 
integer , intent (in) :: m,n 
real (kind = 8) , intent(in) :: x(m),y(m) 
integer :: i,k,j,p 
p = 100 
do i=0,n-1 
    k = i*4224 
    do j = k+1,k+4224 
     write(p,*) x(j),y(j) 
    end do 
    p = p + 1 
end do 
end subroutine split 

Эта подпрограмма производит выходные файлы fort.100 в fort.119 правильно. Но он показывает следующую ошибку:

unit = 100, file = 'fort.100' Fortran runtime error: End of file

Где я иду не так ?.

+0

Попробуйте написать пустую строку в конце каждого файла. Кроме того, закройте ваши «нет» файлы в цикле чтения. –

+0

'@ MichaelO.' нет, он не работает.Снова повторить ту же ошибку. – Joe

+0

Ну, тогда вы должны указать каждый файл явно, как для чтения, так и для записи. –

ответ

1

Интересует здесь подключение к файлу. Программа здесь использует две формы подключения: preconnection и заявление open. Мы игнорируем подключение к datafile.txt здесь.

Мы видим preconnection в подпрограмме с

write(p,*) x(j),y(j) 

, где число единиц p не было ранее в open заявлении. Здесь вызывается имя файла по умолчанию fort.100 (и т. Д.).

После того, как подпрограмма была вызвана, эти 20 предварительно соединенных блоков имели каждый записанный файл. Каждое из этих соединений расположено в конце файла. Это заметная часть.

Когда после подпрограммы, мы приходим к петле с

open(no) 

мы, потому что мы не закрыли соединение, открывая соединение с номером модуля, который уже подключен к файлу. Это вполне приемлемо. Но мы должны понять, что это значит.

В заявлении open(no) нет спецификатора файла, что означает, что устройство остается подключенным к файлу, к которому он был подключен ранее. Поскольку другого спецификатора нет, ничего о связи не изменяется. В частности, соединение не перемещается: мы все еще находимся в конце каждого файла.

Итак, прочитайте, мы пытаемся прочитать из файла, когда мы позиционируем его конец. Результат: ошибка конца файла.

Теперь, как это решить?

Один из способов - изменить положение соединения. Хотя мы можем захотеть open(no, position='rewind'), мы не можем этого сделать. Существует, однако

rewind no ! An unfortunate unit number name; could also be rewind(no). 

В качестве альтернативы, как это было предложено в комментариях по этому вопросу, мы могли бы закрыть каждое соединение, и открыть в цикле (с явным position='rewind') для чтения.

+0

@ 'francescalus' большое спасибо. – Joe

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