LINUX.ORG.RU

Программа с Windows на LINUX - проблема с файлами. Fortran


0

1

Здравствуйте! Переделываю программу, написанную когда-то для работы в Windows, для LINUX. Программа на Fortran. Проблема в следующем. Имеется файл, бесформатный, прямого доступа, с длиной записи 512. Файл имеет n записей. Когда мы в Windows записывали данные в этот файл - все записи были по 512 byte, не смотря на то, что в каждую запись писалось <512 byte. Т.е. получался файл размером n*512. Теперь же в LINUX при записи в этот файл n-1 запись получается по 512 byte, а в n-ой записи столько, сколько мы записали, т.е. <512. И при считывании данных из этого файла возникает ошибка «End of file». Подскажите, пожалуйста, может быть есть какая-нибудь функция, дописывающая последнюю запись (нулями, пробелами?), или может есть какой-нибудь ключ компиляции, чтобы последняя запись не «обрезалась»? Или что-то еще?



Последнее исправление: Inna (всего исправлений: 1)

Не знаю поможет вам или нет, вот ссылка о том как устроен unformatted http://local.wasp.uwa.edu.au/~pbourke/dataformats/fortran/ , в линуксе с ifort доступна опция form=binary как для чтения, так и для записи, которая не содержит header'ов(то есть пишет только значения и файл получается такой же как и в си). Думаю, что не проблема будет и дописать в файл, если знать сколько байтов там не хватает

gameover__
()
Ответ на: комментарий от Inna

Может быть и в этом(не использовал), только я думаю, что mpif90 - это обертка к какому-нибудь компилятору(в случае интеловских машин это либо ifort, либо GNU fortran compiler), а не он сам. В любом случае стоит попробовать написать простейшие программки и проверить. Кстати, в таком случае какая операционная система и архитектура?(помочь ничем не смогу, тк недавно лишился доступа к PowerPC с AIX, но самому интересно узнать, где это не работает)

gameover__
()

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

Покажите, как файл открываете и как пишете.

Vadim_Z
()

Лучше бы один раз увидеть кусок кода, чем гадать как считываются данные.

// Я уже давно не удивляюсь сюрпризам фортрана.

Zodd ★★★★★
()
Ответ на: комментарий от Vadim_Z

открываем

«OPEN(Nt%nt3,file='nt3.dat',status='REPLACE',access='direct',& form='unformatted',recl=512,blocksize=512) ......»

пишем в вызываемой подпрограмме

«SUBROUTINE ELTS51 (e,pu,h,ro,nsh,numcod,ivet,numel,l,nst,& nt6,nt7,typel,nver) .......

write(nt6,rec=l) typel,nsh+nst,ncn,i1,i2,i3,i4,e,pu,ro,h,pp .......»

Inna
() автор топика
Ответ на: комментарий от Inna

Прочитал удаленный комментарий.

Вопрос первый — какая версия gfortran-а ? У меня gfortran дополняет запись нулями, так что всё ок.

(нужен вывод gfortran -v)

Второе — очень важно, что единицы, в которых указывается длина записи, зависят от реализации — в gfortran это байты, в intel fortran это 4байтные целые.

У Меткалфа и Рида написано, что, если запись пишется не целиком, последствия не определены.

Vadim_Z
()

И все-таки, если отставить на время формат файла, нельзя ли использовать, например, какую-нибудь интерфейсную функцию? Я попыталась использовать truncate... Насколько я поняла из описания, она должна обрезать файл до нужной длины, или дописывать (нулями или пробелами), если он короче. Но че-то она не сработала :-( Может там надо было какой модуль или библиотеку подключить?

Inna
() автор топика
Ответ на: комментарий от Inna

P.S. В стандарте написано, что не определено, что будет в _остатке записи_, т.е. длина все равно остается такой, какая указана в RECL.

Vadim_Z
()
Ответ на: комментарий от Inna

Вообще, если ничего не получится, пишите перед закрытием еще одну запись (n+1) с нулями и всё на том.

Vadim_Z
()

Для нормальной работы с бинарными файлами в Фортране лучше использовать access = 'stream'

EVP
()
Ответ на: комментарий от EVP

Если компилятор поддерживает (это из стандарта-2003). Но stream удобен для работы с абстрактными бинарными файлами сложной структуры, а тут, имхо, direct access вполне удобен.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

g95 и gfortran stream поддерживают.

Хм, не могу похвастаться детальным знанием input/output в Фортране, но imho stream наиболее удобен для работы с бинарными файлами любой структуры.

EVP
()
Ответ на: комментарий от gameover__

Спасибо всем! Попробую поставить ifort. :-)

Inna
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.