Обработка
последовательных файлов в программе
Кузнецова В. С., преподаватель информатики,
МОУ
межшкольный учебный комбинат №2, г. Хабаровск
Одним
из трудных для учащихся и преподавателей разделов программирования является
программирование обработки файлов. В Хабаровском межшкольном учебном комбинате
№2 накоплен определенный опыт по обучению школьников приемам программирования,
в том числе, при работе с файлами. Предлагаем вниманию читателей материал на
эту тему, подготовленный В.С. Кузнецовой.
В
разделе алгоритмизация и программирование мы работаем в основном с простыми
типами данных и только одним из сложных (структурных) типов данных – массивами,
при этом опускается работа с файлами данных. Это связано с тем, что в учебном
плане мало учебных часов отводится на данный раздел. Несмотря на нехватку
времени, желательно в конце раздела рассмотреть тему "Обработка
последовательных файлов в программе". Учащиеся уже должны знать, что такое
файл. Поэтому занятие необходимо начать с восстановления опорных знаний:
Что
такое файл?
Какими
способами можно создать файл?
Каким
способом вводили данные в программу?
Каким
способом выводили данные из программы?
Какие
операторы при этом использовали?
К
данным, записанным на диске можно обратиться прямым методом доступа или
последовательным методом доступа. При последовательном доступе данные должны
читаться из файла в том порядке, в каком они были записаны. Прямой доступ к
файлу позволяет читать и обновлять записи независимо от их положения в файле, без
перебора.
Последовательные
файлы следует рассматривать как альтернативу экрана и клавиатуры. Все, что
выводилось на экран, в таком виде и по таким же правилам выводится в
последовательный файл, а все, что вводилось с клавиатуры, вводится из
последовательного файла.
Пусть
данные записаны на диске в файле File1.dat. Как к ним обратиться из программы?
Для этого необходимо в программе предусмотреть:
Связь
имени файла с каналом ввода – вывода и объявить его открытым.
Объявить
способ доступа к файлу (последовательный или прямой).
Переслать
данные.
Закрыть
канал ввода – вывода, связанный с файлом.
Рассмотрим
операторы, с помощью которых осуществляется эта работа на языках
программирования Бейсик и Паскаль.
На
языке программирования Бейсик.
Оператор
OPEN "открывает" файл, т.е. делает файл на диске известным программе,
связывает имя файла на диске с номером канала ввода – вывода в программе и
указывает режим работы с файлом.
Формат:
Open
"имя файла" [for режим] as # номер канала [len=размер записи]
Режимы
для последовательных файлов:
INPUT - для чтения
OUTPUT - для записи
APPEND - для добавления данных в файл.
Пример:
Open "File1.dat" for input as
#1
Оператор
PRINT # предназначен для вывода данных в файл.
Формат:
PRINT #номер канала, имя переменной
Пример:
Print #1, fam$(i), sum(i)
Оператор
INPUT # предназначен для ввода переменных из файла (так же как это делает
оператор INPUT при их вводе с клавиатуры).
Формат:
INPUT #номер канала, список переменных
Пример:
Input #1, fam$(i), kol(i)
Функция
EOF позволяет определить конец файла.
Формат:
EOF(номер канала)
Оператор
CLOSE # "закрывает" файл, т.е. отсоединяет его от программы и
освобождает в ней канал ввода - вывода.
Формат:
CLOSE #номер канала
Задача:
Рассчитать зарплату на каждого члена бригады и записать в файл File2.dat данные
фамилию члена бригады и его зарплату с учетом подоходного налога. Данные по
каждому члену бригады (фамилия и количество сделанных изделий) содержатся в
файле File1.dat. Примечание: количество членов бригады, стоимость изделия и
процент на зарплату от прибыли ввести с клавиатуры.
Input
" количество членов бригады ";n
Input
" стоимость изделия";r
Input
" процент на зарплату от прибыли ";p
p
= p/100
Dim
fam(n), kol(n), sum(n)
Open "File1.dat" for input
as #1
for i = 1 to n
Input #1, fam$(i), kol(i)
sum(i)
= kol(i)*r*p*0.13
next
i
Close
#1
Open "File2.dat" for
output as #1
for i = 1 to n
Print #1, fam$(i), sum(i)
next
i :Close #1
На
языке программирования Паскаль.
В
Турбо Паскале различают текстовые файлы, типизированные файлы и
нетипизированные файлы. При работе с файлами ключевым понятием является понятие
переменной файлового типа или файловой переменной и описывается она в разделе
переменных в зависимости от класса файла. Для текстовых файлов файловая
переменная принадлежит стандартному типу Text. Файловая переменная (ф.п.)
связывается с именем файла с помощью оператора ASSIGN.
Формат:
Assign
(,' ');
Он
должен быть первым среди операторов, работающих с файлом. Прежде, чем начать
работать с файлом его нужно "открыть". Оператор RESET открывает уже
существующий файл, а оператор REWRITE открывает новый файл или файл, содержимое
которого полностью заменяется.
Форматы:
Reset
();
Rewrite
();
Для
чтения данных из файла используются процедуры READLN, READ, BLOCKREAD.
Формат:
Readln
(, );
Для
записи данных в файл используются процедуры WRITELN, WRITE, BLOCKWRITE.
Формат:
Writeln
(, );
После
завершения работы с файлом , его необходимо "закрыть" оператором Close.
Формат:
Close ();
Уничтожить
ненужный файл оператором Erase (), а переименовать файл –
оператором Rename (,), где строка представляет новое
имя файла.
Текстовый
файл трактуется в Турбо Паскале как совокупность строк переменной длины. Доступ
к каждой строке последовательный, начиная с первой. В конце каждой строки
ставится маркер EOLN (End Of Line - конец строки) , а в конце всего файла
маркер EOF (End Of File – конец файла).
Рассмотрим
работу с файлами на примерах.
Пример
1.
На
диске а: записан файл posl.txt, в каждой строке которого записана пословица.
Определить сколько букв в каждой пословице и вывести результат вычисления на
экран.
program
texst;
var
f: text; {* файловая переменная *}
s:
integer; {* число букв
*}
sim:
char; {* символ
*}
begin
Assign
(f, 'a:posl.txt');
reset
(f); {* открытие файла *}
while
not eof (f) do {* проверка
конца файла *}
begin
s:=0;
while
not eoln (f) do {* проверка конца строки *}
begin
read(f,
sim);
if
(sim' ') or (sim',') then s:=s+1;
end;
writeln('число
букв в пословице ',s);
readln(f); {*
переход на новую строку *}
end;
Close(f)
{**}
end.
Пример
2.
В
существующем файле dan1.dat записана матрица из целых чисел. В новый файл
dan2.dat переписать данную матрицу и добавить в каждую строку слово
"сумма=" и результат вычисления суммы чисел в данной строке.
Program
matrica;
var f1,f2: text;
x, s: integer;
begin
Assign
(f1, 'dan1.dat');
Reset
(f1); {* открытие файла для чтения *}
Assign
(f2, 'dan2.dat');
Rewrite
(f2); {* открытие файла для записи *}
While
not eof (f1) do
begin
s:=0;
While not eoln (f1) do
begin
Read(f1,x);
Write(f2,x);
s:=
s + x;
end;
Writeln (f2,' ',' сумма=',s);
Readln(f1);
end;
close(f1);
close(f2);
Writeln
('Работа завершена, файл создан на диске');
end.
При
выполнении операций ввода-вывода данных по умолчанию автоматически производится
проверка на возникновение ошибки. При обнаружении ошибки выполнение программы
прекращается. Но в программе можно предусмотреть собственную реакцию на
ошибочные ситуации. Для этого в начале "опасного" фрагмента
отключается автоматическая проверка {$I-}. При возникновении ошибки формируется
код, который обрабатывается функцией IOResult. Функция IOResult возвращает в
программу код ошибки, обнуляет этот код, поэтому последующие обращения к этой
функции будут давать нулевой результат, пока какая-либо операция не закончится
аварийно.
Пример:
Assign
(f, 'file1.dat');
{$I-} {* отключаем автоматическую проверку *}
Reset
(f);
code:=
IOResult; {* получили код результата *}
if
code 0 then
begin {* возникла ошибка *}
write
(' Ошибка при открытии файла ');
case
code of
1:
write('файл не найден');
3:
write('маршрут не найден');
4:
write('слишком много открытых файлов');
5:
write('запрет доступа к файлу');
12:
write('некорректный код доступа к файлам');
else
……..
end
end;
{$I-} {*
включаем автоматическую проверку *}
…………………….
После
рассмотренных примеров можно предложить задачи для самостоятельной работы.
Задача
1. Данные об абитуриентах (фамилия, имя, отчество, средний балл аттестата)
содержатся в файле F1.txt. Напишите программу, которая запрашивала бы отметки
всех сданных экзамен каждого абитуриента и формировала новый файл F2,.txt в
который вошли бы следующие сведения об абитуриентах: фамилия, имя, отчество,
средний балл аттестата, отметка1, отметка2, отметка3.
Задача
2. Данные о налогоплательщиках (фамилия, имя, отчество, адрес) находятся в
файле F1.txt. Написать программу, которая выводила эти сведения в таблицу:
Фамилия, имя, отчество
адрес
доход
налог
Доход
ввести с клавиатуры. Налог рассчитать 15% от дохода. Доход и налог вывести в
таблицу.
Задача
3. Составить программу обработки психологического теста. Вопросы, ответы и
баллы за каждый вопрос содержатся в последовательном файле.
Список литературы
Для
подготовки данной работы были использованы материалы с сайта http://www.khspu.ru