- •Операции над внешними файлами
- •Оператор Read
- •Оператор Write
- •Оператор Close
- •Файлы последовательного доступа Форматные файлы
- •Неформатные файлы
- •Файлы прямого доступа
- •Добавление записи в файл прямого доступа.
- •Удаление записи из файла прямого доступа
- •Создание информационно-справочной системы
- •Выбор метода доступа в файле и типа записи
Создание информационно-справочной системы
Дан файл, содержащий сведения о товарах: название товара, цена, количество единиц товара. Получить сведения об общей стоимости товара определенного наименования и его количестве.
Выберем для создания неформатный файл прямого доступа.
Написать программу, позволяющую выбрать из предлагаемого меню определенный пункт.
Создание файла
Просмотр
Справка
Выход
Создадим текстовый форматный файл menu.txt с текстом меню (либо в блокноте, либо в редакторе CVF).
menu
1 create
2 view
3 spravka
0 out
viberi punkt menu
Напишем модуль описания (чтобы не писать описание структуры во всех процедурах).
module global
implicit none
integer, parameter::n=30 !количество записей
Type tovar
Character (20) name
integer kol
real cost
End type tovar
Type (tovar) z !переменная производного типа
integer I !номер записи в файле прямого доступа
character(79) str !переменная симв. типа для вывода строки из файла меню меню на экран
character(1) pm !пункт меню
end module
! Главная программа
program main
use global !модуль общих описаний
call obr_menu() !вызов процедуры обработки меню
end
Процедура обработки меню
subroutine obr_menu()
use global
open(10, file='menu.txt')
pm='1'
cicl1:do while(pm/='0')
rewind(10) !установка на начало
call system('cls') !очистка экрана
cicl2:do while(.not. eof(10))
read(10,'(A)') str !чтение из файла строки меню
print*, str !вывод на экран этой строки
enddo cicl2
read*, pm !считывание нажатой клавиши
select case (pm) !обработка выбранного пункта меню
case('1')
call create()
case('2')
call view()
case('3')
call inform()
case('0')
exit
endselect
read* !задержка текста меню на экране
enddo cicl1
close(10)
end subroutine obr_menu
! Процедура создания файла прямого доступа
subroutine create()
use global
implicit none
open(20, file='isx_base.txt', access= 'direct', form='unformatted', recl= sizeof(z))
do i=1, n
print*,'bb name'
read*,z.name !формирование компонент структуры
print*,'bb kol'
read*,z.kol
print*,'bb zenu'
read*,z.cost
write(20, rec=i)z запись сформированной структуры в файл
enddo
close(20)
end subroutine create
! Процедура просмотра
subroutine view()
use global
implicit none
open(20, file='isx_base.txt', access= 'direct', form='unformatted', recl= sizeof(z))
i=0 !номер записи
print*,' name novara ',' kol. tow ',' cena tow'
do while (.not.eof(20))
i=i+1
read(20, rec=i ) z !чтение из файла всей структуры
print*,z. name, z.kol, z.cost !вывод на экран компонент
enddo
close(20)
end subroutine view
! Процедура справка
subroutine inform()
use global
implicit none
character(20) newname
real value
integer k
open(20, file='isx_base.txt', access= 'direct', form='unformatted', recl=sizeof(z))
i=0
print*,'name new tovara'
read*, newname
k=0
value=0
do while(.not. eof(20))
i=i+1
read(20,rec=i)z
if (z.name==newname)then
k=k+z. kol
value=value+k* z. cost ! вычисление стоимости
endif
enddo
print'(3 (2x, A),I3, 5x, A, F4.1)','tow', newname, 'kol=', k, 'value=', value
close(20)
end subroutine inform