Обработка последовательных файлов в программе
СОДЕРЖАНИЕ: Обработка последовательных файлов в программе Кузнецова В. С., преподаватель информатики, МОУ межшкольный учебный комбинат №2, г. Хабаровск Одним из трудных для учащихся и преподавателей разделов программирования является программирование обработки файлов. В Хабаровском межшкольном учебном комбинате №2 накоплен определенный опыт по обучению школьников приемам программирования, в том числе, при работе с файлами.
Обработка последовательных файлов в программе
Кузнецова В. С., преподаватель информатики, МОУ межшкольный учебный комбинат №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. Составить программу обработки психологического теста. Вопросы, ответы и баллы за каждый вопрос содержатся в последовательном файле.