Почему прямой доступ ввода-вывода работает неправильно с Intel Visual Fortran
Эта программа
program test
real a(10)
open(1, file='f1',access='direct', recl=20)
do i=1, 10
a(i) = i-1
end do
write(1, rec=1)(a(i),i=1,5)
write(1, rec=2)(a(i),i=6,10)
close(1)
open(1, file='f1',access='direct',recl=8)
read(1, rec=4)(a(i),i =5,9,4)
print*,a
end
некорректно работает в Visual Fortran (неверно):
0.0000000E+00 1.000000 2.000000 3.000000 9.000000
5.000000 6.000000 7.000000 0.0000000E+00 9.000000
Результат в WATCOM (правильно):
0.0000000 1.0000000 2.0000000 3.0000000 6.0000000
5.0000000 6.0000000 7.0000000 7.0000000 9.0000000
Зачем?
2 ответа
Длина по умолчанию для RECL в Visual Fortran - это слово (4 байта). Если вы скомпилируете с опцией "Использовать байты как RECL= единицу измерения для неформатированного файла" (/accept:byterecl), вы получите то, что ожидаете.
Вам не нужно знать при написании кода, какова длина записи в любых единицах. настройка recl=20
или же recl=5
и в зависимости от точного поведения вашего компилятора и точного real
Размер - рецепт будущих проблем.
Вы должны спросить у компилятора размер записи в единицах, которые она использует:
integer :: recl5, recl2
inquire(iolength=recl5) (a(i),i=1,5)
open(1, file='f1',access='direct', recl=recl5)
...
inquire(iolength=recl2) (a(i),i =5,9,4)
open(1, file='f1',access='direct',recl=recl2)
Примечание: в Fortran 90 это может быть намного короче, если использовать обозначение подрешетки.
Примечание 2: Для некоторых компиляторов ваша программа никогда не будет работать, так как компилятору разрешено использовать метки конца записи в файле, и вы должны всегда открывать его с одним и тем же recl
, Но это не часто.