LINUX.ORG.RU

[FORTRAN-90] Файл прямого доступа: не переходит в новую строку после каждой записи

 


0

1

Сабж. Через программу заполняю форматный файл прямого доступа сведениями о таблетках, вроде все делаю правильно, однако каждую следующую запись программулина дружелюбно записывает сразу после предыдущей, не переходя в новую строку (wtf).

Болит 4-й пункт кейса. На данный момент интересует только то, чтобы каждая запись была в новой строке... Файл обязательно должен быть прямого доступа - таково условие задачи.

Заранее спасибо. P.S. Здесь единственное место, где всегда помогают, при этом по делу и быстро.

Код программы:

program lab12_18

type medicine
character(20) name
integer amount
real price
integer life
end type medicine

type (medicine) :: a
integer i,ierr,input
real pmin,pmax
logical(1) f

open(1,file='lab12/18_in.txt',iostat=ierr,form='formatted',access='direct',recl=32)
print*
if(ierr/=0) stop 'Fatal Error: File not found'
!if(EOF(1)) stop 'Error: File is empty'

1 format (A20,I3,F7.2,I2)
call system('color 70')

do while (1)
call system('cls')
print*,'-----------Menu--------------'
print*,'[1] Do main task             '
print*,'[2] Delete empty medicine    '
print*,'[3] Edit records             '
print*,'[4] Add new record           '
print*,'[5] Exit                     '
print*,'-----------------------------'

read*,input

i=0;s=0;f=.false.

selectcase(input)
	case(1)
!-----------------1---------------------
call system('cls')
read(1,1,rec=1) a.name,a.amount,a.price,a.life
pmin=a.price
pmax=a.price
print*,'Can be kept longer than 3 mounth:'
do while (.not.EOF(1))
i=i+1
read(1,1,rec=i) a
if(a.price>=pmax) pmax=a.price
if(a.price<pmin) pmin=a.price
s=s+a.price
	if(a.life>3) then 
	write(*,'(2x,A20,I5,F7.2,I2)') a
	f=.true.
	endif
enddo
print*
	if(.not.f) print*,'No one'
print*,'-------------------------------------'
write(*,'(2x,A30,F7.2)') 'The higher price is ',pmax
write(*,'(2x,A30,F7.2)') 'The lower price is ',pmin
write(*,'(2x,A30,F7.2)') 'Total cost of all medicine: ',s
write(*,'(2x,A30,I2)') 'Total amount of medicine: ',i
print*,'-------------------------------------';print*
pause
!-----------------end-1------------------

case(2)
!----------------2-----------------------
call system('cls')
do while(.not.EOF(1))
i=i+1;
read(1,1,rec=i) a
if(a.amount==0) write(1,'(A)',rec=i);
enddo
print*, 'Done'
pause
!-----------------end-2------------------

	case(3)
!--------------------3-------------------
call system('cls')
do
print*,"Enter record's number to edit"
read*,i
print*,"OK. Enter new:"
write(*,'(A\)') "Name: "; read(*,'(A20)') a.name;
write(*,'(A\)') "Amount: "; read*,a.amount;
write(*,'(A\)') "Price: "; read*,a.price; 
write(*,'(A\)') "Life Time: "; read*,a.life;
write(1,1,rec=i) a.name,a.amount,a.price,a.life;
print*; print*,"Do it once more? (y/n)"
read*, a.name
	if(a.name == 'n') then
	exit
	write(1,rec=i+1)
	endif
enddo
!------------end-3-----------------------
	
	case(4)
!-----------------4----------------------
call system ('cls')
i=1
do while(.not.EOF(1))
read(1,*)
i=i+1
enddo
do
print*,"Enter new data"
write(*,'(A\)') "Name: "; read(*,'(A20)') a.name;
write(*,'(A\)') "Amount: "; read*,a.amount;
write(*,'(A\)') "Price: "; read*,a.price; 
write(*,'(A\)') "Life Time: "; read*,a.life;
write(1,1,rec=i) a.name,a.amount,a.price,a.life;
print*; print*,"Do it once more? (y/n)"
i=i+1
read*, a.name
	if(a.name == 'n') exit
enddo
!---------------end-4-------------------

case(5) 
exit

end select

close(1)

enddo !end main while
end


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

'(A\)'

Разве это валидный формат?

write(1,1,rec=i) a.name,a.amount,a.price,a.life;

Ты пишешь в запись под номером i, то есть последнюю, а тебе надо в новую. Замени на i+1

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

Не, бро, все четко там было в общем... Сегодня с преподом поговорил, он сказал, что это на новой версии фортрана так, нужно операции проводить в неформатном файле поэтому, а финальные результаты для чтения писать на экран или в текстовый файл. Все равно, спасибо за помощь.

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