фортран - прочитать из файла

Elina74

в файле лежит такое:
1.13 2.3 AP8MAX INT 25
есть переменные:
REAL L_FROMFILE, BB0_FROMFILE
CHARACTER*5 FLUXTYPE
CHARACTER*6 MODEL
читаю из файла:
READ(INFILE, 'F5.2, F5.2, A7', END=9999) L_FROMFILE, BB0_FROMFILE, MODEL
получаю ошибку:
*ERR* IO-07 bad character in input field
что я делаю не так?

Elina74

Вообще в фортране есть такие форматы? Форматы, которые означают:
"Вот тут число. Длины его не знаю, но это число с точкой (или без точки, пофигу). Дальше пробельный символ, или два, или хз сколько, но пробельные. Дальше строка, длины не знаю, не больше заданной, без пробелов.".
А?
Аццы модульного программирования и прочей по!

yolki

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

Elina74

Наверное, беда в том, что я пользуюсь Open Watcom FORTRAN-77 version 1.4, а в этом стандарте нельзя очень многого, что появилось в фортране-90. А пользоваться этим стандартом я вынужден по той причине, что пользуюсь старой прогой и должен написать вокруг нее удобную "оболочку". И эта старая прога стоит мне кучу нервов и крови, если ее компилить под любым компилятором, поддерживающим фортран-90 (пробовал интеловский и salford).
Максимум, чего я добился за последнее время, это:
В файле inp находится такая строка:
3.1415926 23.5 -11 AP8AE8
Программа:

real a,b,c
integer infile
character*11 str
print *,'starting'
infile = 16
open (infile, file='inp', status='old', form='formatted')
print *,'1'
read (infile, *) a,b,c
print *,a,b,c
read (infile, *) str
print *,str
close (infile)
stop
end

Результат:

starting
1
3.1415925 23.5000000 -11.0000000
*ERR* IO-09 system file error - end of file

Если разбивать чтение на разные операторы, к примеру, в цикле, сбой происходит сразу на второй раз, т.е. прочитывается только одно число.
Если вместо строки
read (infile, *) a,b,c
Написать
read (infile, *) a,b,c,str
сбой происходит в нем, появляется сообщение

starting
1
*ERR* IO-07 bad character in input field

Если же начать сразу читать строковую переменную, она считывается, но только однажды:

real a,b,c
integer infile
character*11 str
print *,'starting'
infile = 16
open (infile, file='inp', status='old', form='formatted')
print *,'1'
read (infile, 124) str
print *,str
read (infile, 124) str
print *,str
close (infile)
124 format (A7)
stop
end

со следующим результатом:

starting
1
3.14159
*ERR* IO-09 system file error - end of file

Чо делать

yolki

попробовать поразбираться с переовд-строки/возврат каретки.
м.б. кто-то лишний или кого-то не хватает.

Elina74

Желание разбираться пропало. Заменил все символьные обозначения в файлах на цифровые и таки почти до конца переписал эту прогу.
Ну и уродский этот фортран временами!

rooony

в файле лежит такое:
1.13 2.3 AP8MAX INT 25
есть переменные:
REAL L_FROMFILE, BB0_FROMFILE
CHARACTER*5 FLUXTYPE
CHARACTER*6 MODEL
читаю из файла:
READ(INFILE, 'F5.2, F5.2, A7', END=9999) L_FROMFILE, BB0_FROMFILE, MODEL
получаю ошибку:
*ERR* IO-07 bad character in input field
Смотри. У тебя в формате 'F5.2, F5.2, A7' подразумевается, что вначале в списке
ввода должно быть помещено вещ. число длины пять символов, потом (без пробела)
еще одно вещ. число такой же длины, и потом, опять без пробела,
символьная переменная длины 7 символов. Вот пример такого списка:
12.3412.34ABCDEFG
Теперь берем твой список ввода:
1.13 2.3 AP8MAX INT 25
Первое число - 4 позиции вместо обещанных пяти, потом пробел. Ну, допустим, пробел
воcпринимается как цифра 0 в конце первого числа. Второе число занимает всего три
позиции, потом снова идет пробел (допустим, снова как бы нуль а потом, на пятой
обещанной позиции, стоит уже буква A. Программа, видимо, пытается прочитать эту
букву как последний десятичный разряд второго вещественного числа. Что она
присваивает при этом числу - трудно даже сказать. Соответственно,
ввод символьной переменной должен начаться уже с буквы P, от которой будет
отсчитано 7 символов, т.е. символьная переменная получится вида 'P8MAX I'.
Ну а в конце списка стоят еще какие-то символы, не предусмотренные форматом.

Выход: или пользоваться свободным форматом, тогда записи будут просто читаться подряд,
as is, через пробелы. Или переписать формат, или переписать строку данных.
Кстати, синтаксис неявного описания формата в фортране 77 немножко другой:
READ(INFILE, '(F5.2, F5.2, A7)', END=9999)
Это тоже может иметь значение в зависимости от транслятора.

SPARTAK3959

А по-моему не временами, а всегда. Я чтобы обойти подобные проблемы делал посимвольный ввод/вывод и вручную читал/записывал действительные числа.

Elina74

Посмотри, что я написал чуть ниже первого поста - свободный формат не помогает,
read (infile, *) a,b,c
где a,b,c - вещественные числа, эта команда считывает из файла три числа
а вот
read (infile, *) a,b,c,str
ничего не считывает, происходит ошибка.

rooony

Да,я сам сталкивался с трудностями считывания символьных
переменных в свободном формате. Как поступить - есть много
вариантов в обход.
1. Сделать аккуратное форматное считывание. Позаботиться о
пробелах, о длинах переменных и т.п.
2. Снести символьную переменную в следующую строчку входного файла.
Соотв-но, разбить оператор ввода на два: первый в свободном формате
считывает три вещ. числа из первой строки, второй считывает в символьном
формате символьную переменную из следующей строки. Я лично за этот
вариант. Всегда проще реорганизовать раз и навсегда свои данные, чем потом
все время мучиться
3. Можно попробовать поиграть в ключ \ , который в описании формата означает
отсутствие перехода к новой записи (т.е. к новой строке инпут-файла) по завершении
выполнения текущего оператора READ. Например,
READ(file, '(F5.2,1x,\)') a1
READ(file, '(F5.2)') a2
при считывании из файла вида
12.34 56.78
91.23
присвоит a1=12.34, a2=56.78. То есть то же, что
и считывание одним оператором READ. Если же
символ \ в первом операторе отсутствует, то ввод,
по идее, произойдет следующий: a1=12.34, a2=91.23,
потому что второй оператор ввода автоматически
переводит положение курсора на следующую запись
(строку).
Правда, это все может зависеть от версии
транслятора, так что стоит поэкспериментировать.

Ублюдок

Ну вы и дебики реально, займитесь нормальными вещами, а не этим говном, дерьмо ваш фортран древнее вонючее
Оставить комментарий
Имя или ник:
Комментарий: