implicit none
integer i, k
real x
!открываем исходный файл
open (30, file='f_dir.txt', access='direct', form='unformatted', recl=4)
!открываем временный файл (неформатный)
open(10, form='unformatted', status='scratch')
i=0!формирование номера записи
do while (.not.eof (30))
i=i+1
read(30, rec=i) x!прочитали запись из исходного файла
if (x>0)then
write(10) x!записали во временный файл
endif
enddo
rewind(10)!вернулись на начало временного файла
close(30, status='delete')! удалили исходный файл
! заново открыли исходный файл
open (30, file='f_dir.txt', access='direct', form='unformatted',recl=4)
i=0
do while (.not.eof (10))
i=i+1
read (10) x! прочитали запись из временного файла
write (30, rec=i)x! записал в основной
enddo
close(10)
close(30)
End subroutine
Пример
Создание информационно-справочной системы
Дан файл, содержащий сведения о товарах: название товара, цена, количество единиц товара. Получить сведения об общей стоимости товара определенного наименования и его количестве.
Выберем для создания неформатный файл прямого доступа.
Написать программу, позволяющую выбрать из предлагаемого меню определенный пункт.
1. Создание файла
2. Просмотр
3. Справка
4. Выход
Создадим текстовый форматный файл 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()