[фортран] Как прочитать с консоли произвольное число данных?

yolki

Был код:

     read(5,3XP(II=1,INBP) 00000191
     read(5,3YP(II=1,INBP) 00000192
    3 FORMAT(8F10.5)

Насколько я понимаю, происходит считывание из файла сначала иксов, потом ыгреков, по 8 штук в строке.
как модифицировать так, чтобы он умел считывать необходимое количество иксов-игреков независимо от их количества в каждой строке?
Сейчас пишет, что fmt: unexpected character.
// ну вот так данные у меня готовятся - в некоторых строчках по 5, в некоторых по 8..
// gcc @ f77

lili197602

"Насколько я понимаю, происходит считывание из файла сначала иксов, потом ыгреков, по 8 штук в строке."
Да, но INBP должно равняться 8-ми иначе несостыковка.
"Сейчас пишет, что fmt: unexpected character."
Такое ощущение, что ты вводишь данные не по формату. Он хочет видеть real числа, в количестве 8 штук. Возможно связано с тем что INBP /= 8.
А количество которое надо считывать известно до старта программы?
А то можно так:
read(5,3XP(II=1,5)
read(5,4YP(II=1,8)
3 FORMAT(5F10.5)
4 FORMAT(8F10.5)
=)
Если каждый раз неизвестно сколько вводить надо, то, например, запрашивай сначала сколько будет введено.

Ivan8209

Я бы предложил переформатировать входные данные так, как надо.
Например, с помощью awk.
---
...Я работаю антинаучным аферистом...

yolki

ага, количество известно.
формат входных данных примерно такой:

96
1 2 3 4 5
6 7 8 9 10 11 12 13
14 15 16 17 18
...

96 - количество данных всего.
2 КОНТРА: а в цикле нельзя сделать типа

do 666 i=1,INBP
666 read(5,667) XP(i)
667 format(FX.X)

? Всеядного формата для float нету?

lili197602

А что значит всеядного?
Можно написать вместо Fx.x просто F. Будет работать формат по-умолчанию.
Всеядного по количеству нет. =)
В цикле сделать можно. Работать будет. =)
P.S. Опять все старый фортран пользуют =(

yolki

правильно ли я понимаю, что в случае формата 'F' ему нужно ровно по одному числу в строке? остальные числа в той же строке он будет игнорировать?
а про фортран тут такая штука:
У научника есть прога, которая обсчитывает. прога древняя, на фортране.
Я типа написал новую прогу, которая обсчитывает примерно то же самое, но с некоторыми улучшениями. моя счётная прога - на С.
так вот, у меня получились результаты, которые научник забраковал: типа по симметрии там кое-где функция должна в ноль обращатся. хотя ИМХО там не должна..
в процессе научных споров научник посоветовал пересчитать задачу в его проге. вот ковыряюсь.. пытаюсь свои исходные данные переформировать так, чтобы прога на фортране это скушала.

lili197602

"правильно ли я понимаю, что в случае формата 'F' ему нужно ровно по одному числу в строке? остальные числа в той же строке он будет игнорировать?"
формат в фортране следующий:
[N]F[A.B]
N - сколько F[A.B]
A - сколько всего позиций, с учетом точки
B - сколько после запятой
Например, запись 2F10.1 эквивалентна записи F10.1,F10.1
Насколько я помню, если ты введешь больше или меньше чисел чем описал в формате, то будет ошибка чтения.

durka82

Попробуй упростить код:
read(5,*) XP
read(5,*) YP

Должно работать.
Вроде как формат не должен влиять на кол-во чисел в строке. В моем варианте точно не влияет.
В данном упрощении я считал, что INBP = последнему индуксу массивов XP и YP.

durka82

Всеядного формата для float нету?
Можно вообще * использовать. Ну или F.

durka82

Всеядного по количеству нет.
А что ты под этим понимаешь?
Кто мешает читать из файла до посинения (клнца файла) и динамически выделать память под новые данные?
Опять все старый фортран пользуют
Примеров и книжек по нему к сожалению гораздо больше, чем по новому.
Да и с новыми книжками туго

durka82

Насколько я помню, если ты введешь больше или меньше чисел чем описал в формате, то будет ошибка чтения.
Если введешь больше, то ошибки не будет, а данные останутся для будущих ридов (но мб это на уровне компилятора настраивается).

yolki

неа..

DIMENSION X(100)
open(5,file='a.dat')
read(5,1001) N
1001 format(I2)
write(0,1004) N
1004 format(I2)
do 1 I=1,N
read(5,*) x(i)
write(0,1003) i,x(i)
1 continue
1003 format(I3, F10.5)
C1002 format(*)
close(5)
stop
end

в файле a.dat:

9
1 2 3
4 5 6 7
8 9

вывод проги:

9
1 1.00000
2 4.00000
3 8.00000
list in: end of file
apparent state: unit 5 named a.dat
last format: list io
lately reading sequential formatted external IO
Abort trap: 6 (core dumped)

durka82

Вот это у меня работает:
program s1
implicit none
real X(100)
integer N, I
open(5,file='a.dat')
read(5,*) N
write(*,*) N
read(5,*) X(1:N)
do I=1,N
write(*,*) i,x(i)
end do
close(5)
end

На самом деле проги, написанные в стиле старого фортрана часто переусложнены и загромаждены
Просто раньше было больше условностей.
п.с.: некоторые вещи (типа implicit none) добавлены/изменены скорее по привычке, чем по необходимости.
Основное было - убрать все лишнее (в том числе и форматы)

lili197602

Опередил

durka82

Оставить комментарий
Имя или ник:
Комментарий: