Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Фортран. Работа с файлом


Автор: Bibigonich 4.7.2010, 16:34
Привет, собственно вот что тревожит меня:

Дан файл f, компоненты которого являются действительными числами.
как в программе найти количество этих элементов? Мне нужно число n,для дальнейшей работы программы, для циклов..
пробывал в файле 1ым элементом задать это количество, и его прочитать как n. Но преподаватель сказал что так незя, не правильно.
так собственно как правильно сделать?
слышал про "Также можно ловить конец файла и подсчитывать количество прочитанных чисел". но как это оформить?
еще про оператор Len, но как с ним обращатсья тоже не понимаю, постоянно ошибки выдает

помогите плизз

Автор: Фантом 4.7.2010, 16:46
Цитата(Bibigonich @  4.7.2010,  16:34 Найти цитируемый пост)
пробывал в файле 1ым элементом задать это количество, и его прочитать как n. Но преподаватель сказал что так незя, не правильно.
так собственно как правильно сделать?

Так как раз в большинстве случаев правильно. Только, по-видимому, преподаватель хочет получить что-то другое.

Цитата(Bibigonich @  4.7.2010,  16:34 Найти цитируемый пост)

слышал про "Также можно ловить конец файла и подсчитывать количество прочитанных чисел". но как это оформить?

У оператора read есть спецификатор end, позволяющий указать метку оператора, на который произойдет переход при достижении конца файла. В некоторых реализациях также есть функция eof().

Автор: Bibigonich 4.7.2010, 16:50
ну а как заполучить n. Мне оно надо будет для продолжения.

Вот полное задание:Дан файл f, компоненты которого являются действительными числами. Найти при помощи подпрограммы общего вида
А) сумму компонет файла
Б) модуль суммы и квадрат произведения компонент файла

Вот как оно у меня получилось, всё работает, ток надо по другому полуить значение n.

Код

program nio
dimension a(100)
Open (1,status='old', file='f.txt')
!Вводим данные
read (1,*), n !я в файле прописал цифру, и ее читает программа, как количество элементов
do i=1,n
read (1,*), a(i)
end do
!печатаем данные
print*, 'komponenti faila:'
do i=1,n
print*, a(i)
end do
call subr(a, 1, n, s, p)
m=ABS(s)
qw=p**2
!печатаем сумму
print*, ''
print*, 'summa komponent:'
print*, s
print*, ''
print*, 'Modul summy:'
print*, m
print*, ''
print*, 'kvadrat proizvedeniya komponent:'
print*, qw
close(1)
end
subroutine subr(a, i1, i2, s, p)
dimension a(1) !здесь размер не важен
real s,p
integer i1, i2
s=0
p=1
do i=i1,i2
s=s+a(i)
enddo
do i=i1,i2
p=p*a(i)
end do
return
end


btw: Пишу на Фортране 77, компилятор Compaq Visual Fortran. Если важно

Автор: Фантом 4.7.2010, 17:12
Цитата(Bibigonich @  4.7.2010,  16:50 Найти цитируемый пост)
ну а как заполучить n. Мне оно надо будет для продолжения.

Просто считать попытки ввода.

Автор: Bibigonich 4.7.2010, 17:13
 smile 
как это выглядеть то должно?

Автор: Фантом 4.7.2010, 17:50
Бог мой... в цикле читаем по одному числу и каждый раз прибавляем к счетчику единицу. Когда файл кончится, в счетчике будет искомое количество.

P.S. Для определенности - Вы  программировать умеете? Не конкретно на Фортране, а вообще?

Автор: kemiisto 4.7.2010, 17:58
Код

OPEN(unit=1, file=filename, status='old', action='read', iostat=status)

IF (status == 0) THEN
  DO
    READ (1, *, iostat=status) temp
    IF (status /= 0) EXIT
    n = n + 1
  END DO
ELSE
  ! Сообщить об ошибке открытия файла.
END IF

Автор: FCM 5.7.2010, 09:26
Цитата(Bibigonich @  4.7.2010,  16:50 Найти цитируемый пост)
btw: Пишу на Фортране 77, компилятор Compaq Visual Fortran. Если важно

Зачем писать на 77, если компилятор на 90/95?


Как уже отмечалось выше, в некоторых диалектах Фортрана (в частности в Visual Fortran) есть функция EOF().
Может быть так (но на фортране 90):

Код

...

REAL, ALLOCATABLE :: ARRAY(:), TMP
INTEGER :: N, I
OPEN(10, FILE = "...")
N=0
DO WHILE ( .NOT.EOF(10) )
   READ(10,*)  TMP
   N=N+1
END DO

ALLOCATE(ARRAY(N))
REWIND(10)

DO I = 1, N
   READ(10,*) ARRAY(I)
END DO
...



См. также пример в описании функции EOF в системе помощи CVF.

Автор: Bibigonich 5.7.2010, 19:15
Цитата(FCM @ 5.7.2010,  09:26)

Зачем писать на 77, если компилятор на 90/95?


на 77, потому что в инсте преподают 77, и там же, на компах стоит этот компилятор. вот и все дела

FCM, спасибо, помог. ПРишлось твой код поправить кое где, но в итоге пашет) спасибо. Поставил бы плюсик к репе, но увы, нету 100 постов((

Автор: kemiisto 5.7.2010, 21:33
Цитата(Bibigonich @  5.7.2010,  20:15 Найти цитируемый пост)
FCM, спасибо, помог.

Если помогли, пометь тему решённой в правом верхнем углу первого сообщения.

Цитата(Bibigonich @  5.7.2010,  20:15 Найти цитируемый пост)
Поставил бы плюсик к репе, но увы, нету 100 постов((

Это не проблема. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)