2016-12-30 3 views
0

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

open(500, file='data.dat') 
write(500,fmt='(E14.4,E14.4)') A,B !this SHOULD be printed on unit 500 
write(*, fmt='(E14.4,E14.4)') A,B ! this is printed on terminal 

Я попытался сменить блок, но ничего не меняется. Я попытался открыть новый файл с новым именем и писать на нем, а также в других частях кода, даже в начале, сразу после объявления переменных. Это тоже не работает. Это так расстраивает, потому что все прошло правильно. Что могло случиться?

+1

Вы говорите, что вы ожидаете, но не то, что происходит. Можете ли вы уточнить? Кроме того, можете ли вы дать [mcve], который проявляет проблему? Как я могу только догадываться. Я могу, однако, спросить: что произойдет, если вы положите 'action = 'write', position = 'rewind', status = 'replace'' в' open' заявление? – francescalus

+0

Что происходит, когда вы пытаетесь удалить часть формата? 'write (500, *) A, B' – Peaceful

+0

В стороне: этот пост является примером того, почему вы всегда должны использовать систему контроля версий и проверять изменения рано и часто. Возможность делить секреты изменений, чтобы изолировать плохое редактирование, спасла мне бесчисленные часы и много разочарований. Не морализируя или не поддаваясь на это, пожалуйста, подумайте об изучении меркуриального, git, RCS - любой системы контроля версий, которую вы можете обернуть вокруг. Он окупается почти сразу. – arclight

ответ

0

Использование gfortran 5.3 под Linux и следующая программа (это ваш код с копированием и минимальный шаблон).

program hop 
    implicit none 

    double precision :: A, B 

    A = 1 
    B = 2 

    open(500, file='data.dat') 
    write(500,fmt='(E14.4,E14.4)') A,B !this SHOULD be printed on unit 500 
    write(*, fmt='(E14.4,E14.4)') A,B ! this is printed on terminal 

end program hop 

выходы 0.1000E+01 0.2000E+01 в терминале и точно такой же контент в файле data.dat.

Является ли инструкция записи в программе, которая висит? Невозможность увидеть вывод может быть связана с буферизацией ввода/вывода.

ли поведение меняется при добавлении линии

flush(500) 

после команды записи?

+0

Кроме того, использование аргументов 'iostat' и' iomsg' для 'open',' write' и т. Д. Должно содержать некоторые подсказки, если есть прерывистая или внешняя проблема (то есть диск полный, права доступа к файлам, ...) – arclight

0

Я должен написать файл в цикле. Теперь я открываю файл в цикле, добавив position = 'append', и я закрываю его в конце цикла. Точно так же, как

program pro 
implicit none 
integer (kind=2) :: i, A, B 
do i=1,10 
A=i 
b=i+1 
open(500, file='file.dat', position='append') 
write(500, *) A, B 
close(500) 
enddo 

Это похоже на работу сейчас.

+0

открытие и закрытие на каждой итерации? Откройте его только один раз в начале. –

+0

закрытие делает флеш, если вы пытаетесь просмотреть файл в режиме реального времени во время работы кода. – agentp

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