Може ли Fortran да чете байтове директно от двоичен файл?

Имам двоичен файл, който бих искал да прочета с Fortran. Проблемът е, че не е написан от Fortran, така че няма индикатори за дължина на записа. Така че обичайното неформатирано четене на Fortran няма да работи.

Имах мисъл, че мога да бъда подъл и да прочета файла като форматиран файл, байт по байт (или 4 байта по 4 байта, всъщност) в масив от знаци и след това да конвертирам съдържанието на знаците в цели числа и плаващи числа чрез трансферната функция или страшното твърдение за еквивалентност. Но това не работи: опитвам се да прочета 4 байта наведнъж и според POS изхода от оператора inquire, четенето прескача около 6000 байта или така и масивът от знаци се зарежда с боклуци.

Така че това е забранено. Има ли подробности в този подход, които забравям? Или има просто фундаментално различен и по-добър начин да направите това във Fortran? (BTW, аз също се опитах да прочета в масив integer*1 и масив от байтове. Въпреки че тези кодове се компилираха, когато се стигна до инструкцията за четене, кодът се срина.)


person bob.sacamento    schedule 19.07.2012    source източник


Отговори (1)


да

Fortran 2003 въведе поточен достъп в езика. Преди това повечето процесори поддържаха нещо еквивалентно като разширение, може би наречено "двоично" или подобно.

Неформатиран достъп до поток не налага структура на запис на файла. Като пример, за да прочетете данни от файла, който съответства на един int в придружаващия C процесор (ако има такъв) за конкретен процесор Fortran:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
INTEGER, PARAMETER :: unit = 10
CHARACTER(*), PARAMETER :: filename = 'name of your file'
INTEGER(C_INT) :: data
!***
OPEN(unit, filename, ACCESS='STREAM', FORM='UNFORMATTED')
READ (unit) data
CLOSE(unit)
PRINT "('data was ',I0)", data

Все още може да имате проблеми с endiance и размера на типа данни, но тези аспекти не зависят от езика.

Ако пишете на езиков стандарт преди Fortran 2003, тогава неформатираното четене с директен достъп в подходяща целочислена променлива може да работи - това е специфично за процесора Fortran, но работи за много от настоящите процесори.

person IanH    schedule 19.07.2012
comment
Работи страхотно! Благодаря! И си мислех, че тъкмо ще се справя добре с FORTRAN 90. А сега има какво да науча! А добре. Много благодаря. - person bob.sacamento; 20.07.2012
comment
Без достъп до потока Fortran четенето интерпретира някои данни като информация за дължината на записа. Което едновременно пропусна данни, които искахте да прочетете, и причини грешни дължини на записите. Освен това файлът всъщност няма записи в смисъла на Fortran. - person M. S. B.; 20.07.2012
comment
@M.S.B.: Ако, както е посочено в OP, той първо е опитал с форматирано четене, моето предположение е, че сканира напред, докато удари знак за нов ред. - person janneb; 20.07.2012
comment
@janneb, да. При нормално форматирано четене Fortran ще запълни искания низ, след което ще изхвърли останалата част от записа. Което бихте могли да отмените, като използвате форматиран поток IO! - person M. S. B.; 20.07.2012
comment
@М. S. B. Въвеждането без напредване е това, което би било необходимо, за да се избегне изхвърлянето на останалата част от записа. Напредването на форматиран поток позиционира файла след току-що прочетения запис по същия начин, както напредването на форматиран последователен. Както форматираният поток, така и форматираният последователен имат проблеми с връщащи модели на байтове, които изглеждат като нови редове и/или разделители на записи. - person IanH; 20.07.2012
comment
Въпреки че IanH ми помогна да разреша проблема си, аз дадох още един шанс на нещо за четене на герои. (Да, аз съм малко OCD.) Изглежда, че всичко работи добре, четене байт по байт, докато кодът удари байт, който интерпретира като /n (нов ред). След това се оплаква, че се опитвам да прочета след края на запис и се срива. Няма да оставя това да ме притеснява, но ако някой има повече информация, ще се радвам да го изслушам. Благодаря за страхотната дискусия тук, хора. - person bob.sacamento; 20.07.2012
comment
Не каза какъв достъп до файлове и режими използваш. Ако сте използвали форматиран последователен, новият ред обикновено се използва от реализациите на процесора като маркер за край на записа (във форматиран поток новият ред винаги е край на записа). Следователно - вие питате за данни, процесорът вижда край на записа и след това се оплаква съответно. Може да имате повече късмет да четете байтове (знаци) от файла, като използвате неформатиран директен достъп - но това зависи от това как вашият fortran процесор прилага неформатиран директен достъп. - person IanH; 21.07.2012