- •Чернигов, 2012
- •Введение
- •Правила оформления курсовой работы:
- •1. Общие требования
- •1.1 Оформление
- •1.2 Контроль выполнения
- •2. Задание на курсовую работу
- •2.2 Задания на курсовую работу (основная часть)
- •Практические рекомендации по выполнению основной части курсовой работы
- •Теоретическим материал, необходимым для выполнения работы:
- •Действия с типизированными файлами к основным действиям с записями (элементами) файла относятся:
- •Поиск элемента по ключу
- •Замена содержимого отдельной записи файла;
- •Удаление отдельной записи файла;
- •Вставка новой записи в произвольное место файла
- •Литература Основная литература:
- •Дополнительная литература:
- •Календарный план выполнения курсовой работы
- •Рецензия на курсовой проект
Практические рекомендации по выполнению основной части курсовой работы
Теоретическим материал, необходимым для выполнения работы:
Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осуществляется программами. Использование файлов целесообразно в случае:
долговременного хранения данных;
доступа различных программ к одним и тем же данным;
обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера.
В Паскале определены текстовые файлы, типизированные и нетипизированные. Файл, не содержащий ни одного элемента, называется пустым. Создается файл путем добавления новых записей в конец первоначально пустого файла. Длина файла, т.е. количество элементов, не задается при определении файла.
Все файлы должны быть описаны в программе либо в разделе переменных VAR, либо в разделе типов TYPE. Под чтением файла понимают ввод данных из внешнего файла, находящегося на диске, в оперативную память машины. Запись в файл - вывод результатов работы программы из оперативной памяти на диск в файл.
Работа с файлами выполняется следующими процедурами:
Установочные и завершающие операции
Assign (f, FileName) – связывает файловую переменную f с конкретным файлом с именем FileName. Данную процедуру необходимо использовать до начала работы с файлом. FileName – выражение строкового типа вида:
Диск: \ имя каталога \ имя подкаталога \ … \ имя файла
Если имя диска и имя каталога не указывать, то берутся текущий диск и текущий каталог.
Var spisok: wed; {переменная spisok - запись типа wed}
sp: file of wed; {файловая переменная типа wed}
………………………..
assign(sp,'Vedom2.dat'); {Связывает файловую переменную sp с файлом Vedom.dat }
Reset (f) – открывает файл f для чтения, т.е. указатель устанавливается на первый элемент файла. Предполагается, что открываемый файл уже существует, в противном случае возникает ошибка. В программе может быть произвольное количество вызовов процедуры reset.
Примечание: Важно отметить, что ТР позволяет после выполнения вызова reset не только читать из файла с помощью процедуры Read, но и записывать в файл, т.е. изменять элементы, на которые ссылается указатель файла. Такое изменение выполняется с помощью процедуры Write. В результате на место элемента, на который ссылается указатель файла, будет записано новое значение. Так, например, если необходимо заменить 6-ой элемент файла необходимо 5 раз выполнить процедуру Read и затем процедуру Write.
reset (f) – это процедура последовательного доступа к элементам файла! Но такой доступ не всегда удобен. Прямой доступ к элементам типизированного файла дает процедура Seek (описанная ниже), этот метод основан на том, что элементы файла задаются номерами их позиций в файле.
Rewrite (f) – открывает файл f для записи (указатель так же, как и в предыдущем случае, устанавливается на первый элемент файла). Допускается, что файл не существует, тогда процедура создает файл с заданным именем. Если же такой файл существует, процедура удаляет из него всю информацию. В обоих случаях в результате вызова данной процедуры файловая переменная указывает на нулевой элемент файла (т.е. файл пуст).
Close (f) – закрывает файл f для, очищает внутренний буфер, образованный при открытии файла. Теперь указатель f можно связать с другим файлом.
Для определения конца файла используется стандартная встроенная функция
EOF (файловая переменная),
которая принимает значение True, если достигнут конец файла, и значение False в противном случае.
Операции ввода-вывода
Read (f, x1, x2, …) – считывает в переменные x1, x2, … по одному элементу из файла f, начиная с той позиции, на которую установлен указатель. Операция чтения осуществляется следующим образом: значение, на которое указывает текущий указатель файла, присваивается переменной x1, указатель перемещается на следующую позицию, то же самое выполняется для переменной x2, и т.д. Данная процедура выполнима только в том случае, если не достигнут конец файла (eof(f)=false). Поэтому при составлении программы практически всегда перед каждым вызовом процедуры чтения очередного элемента файла необходимо предусмотреть проверку того, что элементы файла еще не исчерпаны.
Write (f, x1, x2, …) – записывает в файл f значения переменных, начиная с той позиции, на которую указывает файловая переменная. После записи в файл нового элемента, указатель перемещается на следующую позицию. Данная функция выполнима только в том случае, когда достигнут конец файла (eof(f) = true).
Операции перемещения по файлу
Seek (f, N) – функция, позволяющая явно изменить значение текущего указателя, установив его на элемент файла с заданным номером N (N - целочисленное выражение). Данная процедура не выполняет чтения или записи элементов файла, оно лишь перемещает указатель к элементу с номером N. (Первый элемент файла имеет номер 0). Вызов процедуры с аргументами seek (f, filesize(f)) установит указатель на конец файла.
Filepos (f) – функция, позволяющая определить текущее положение указателя (номер элемента). Она имеет только один аргумент – идентификатор файловой переменной и возвращает значение типа longint. Например, после выполнения предыдущих действий seek (f, 4) и
A:=filepos (f);
переменная А типа longint получит значение 5.
Filesize (f) – имеет тип Integer, функция, позволяющая определить размер (кол-во элементов) файла f.
Truncate (файловая переменная); процедура, усекающая файл по текущей позиции указателя файла, т.е. все записи, находящиеся после указателя файла, удаляются.
Eof (f) – функция, возвращающая логическое значение true, если достигнут конец файла.
Специальные операции
Erase (f) – удаляет файл, связанный с файловой переменной f.
Rename (f, NewName) – присваивает файлу, связанному с файловой переменной f, новое имя NewName.
Для добавления записей в конец файла используются процедуры:
Readln (a);
Seek (f, filesize (f));
Write (f, a);
При этом указатель устанавливается за конец файла, т.к. нумерация записей начинается с нуля. После чего с помощью Write можно добавлять записи. Открывать файл можно только процедурой Reset (f).
Для того, чтобы в режиме произвольного доступа считать, а затем изменить значение записи, следует выполнить два вызова процедуры Seek: Один вызов перед операцией Read, а другой - перед операцией Write (т.к. Read после чтения записи переместит указатель к следующей записи).
Для того чтобы обратиться к полю записи, необходимо указать имя переменной и через точку – имя поля:
<имя переменной> . <имя поля>
Обращение к полям имеет громоздкий вид, поэтому удобнее воспользоваться специально предназначенным для этого оператором:
With <имя переменной> Do <оператор>;
Внутри оператора With с полями записи можно работать, как с обычными переменными (т.е. без указания составного имени). Обработка отдельных полей определенных типов осуществляется так же, как и переменных данного типа.
Записи часто используются при работе с таблицами, где каждая запись – это одна строка таблицы. Следовательно, для обработки всей таблицы, необходимо использовать массивы записей.
Стандартный порядок работы с файлами:
Связывание файловой переменной с файлом
Открытие файла
Обработка файла
Закрытие файла
Повторное открытие и связывание файла или повторное связывание файловой переменной с другим файлом и открытие нового связанного файла
Повторная обработка файла
Повторное закрытие файла и т.д.
ПРИМЕР: Создать файл из списка 10 студентов с их оценками (номер, Ф.И.О. и три оценки). Вывести его содержимое на экран, изменить фамилию студента с номером, введенным с клавиатуры, заново прочитать файл. Примечание: номер – может быть эквивалентен «номеру зачетки студента».
Program file;
Type
wed = record {Тип wed включает 3 поля: n, fio, bal}
n : byte ; {n – номер студента в списке}
fio : string[15] ; { fio – Фамилия студента}
bal : array [1..3] of byte; {Поле bal – массив из 3 оценок }
end;
Var spisok : wed ; {Запись spisok типа wed}
sp : file of wed; {Файловая переменная типа wed}
procedure vvod; { ПРОЦЕДУРА СОЗДАНИЯ ФАЙЛА}
var i, j: byte;
begin
{ оператор assign находится в основной программе }
rewrite ( sp); {открытие файла для записи}
with spisok do
For i:=1 to 10 do
begin
n:=i; {описана в основной программе как byte }
writeln (' Введите фамилию - ', i ); readln(fio);
writeln (' Введите 3 оценки ', fio ); For j:= 1 to 3 do readln( bal [j] );
write (sp , spisok); { запись в файл информации о студенте}
end;
close (sp); { закрытие файла для записи, sp - файл записей типа wed }
end; {КОНЕЦ ПРОЦЕДУРА СОЗДАНИЯ ФАЙЛА }
procedure print; { ПРОЦЕДУРА ЧТЕНИЯ И ПЕЧАТИ ВСЕГО ФАЙЛА }
var j : byte;
begin
reset ( sp); {открытие файла для чтения}
writeln (‘ Список студентов: ‘);
while not eof (sp) do {Пока не конец файла}
with spisok do
begin
Read (sp, spisok); {чтение данных из файла в переменную список}
write (n,' ',fio); {вывод записи на экран}
For j:= 1 to 3 do write (' ', bal [j] );
writeln; {переход на следующую строчку на экране}
end;
readln;
close (sp) ; { закрытие файла для записи, sp - файл записей типа wed }
end; { КОНЕЦ ПРОЦЕДУРЫ ЧТЕНИЯ И ПЕЧАТИ ВСЕГО ФАЙЛА }
procedure work; {КОРРЕКТИРОВКА И ЧТЕНИЕ ИЗМЕНЕННОГО ФАЙЛА}
var num: integer;
begin
reset ( sp); {открытие файла для чтения}
writeln ('номер= ');
readln (num); {Задает номер по списку (ключ), изменяемой записи}
seek (sp, num-1); {поиск записи с указанным номером (нумерация записей с 0
поэтому num-1)}
read (sp,spisok); {чтение записи в переменную spisok и перемещение указателя к след. записи}
write ('fio=');
writeln (spisok.fio);
seek (sp,filepos(sp)-1); {возвращение к изменяемой записи }
writeln (‘ Введите новую фамилию’);
readln;
readln(spisok.fio);
write (sp, spisok); {запись в файл измененной записи}
close (sp);
end; {КОНЕЦ ПРОЦЕДУРЫ КОРРЕКТИРОВКА И ЧТЕНИЕ ИЗМЕНЕННОГО ФАЙЛА}
BEGIN {НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ}
assign (sp,'Vedom1.DAT'); {связать файловую переменную sp с файлом Vedom1.dat}
vvod; print; {процедуры создания и чтения файла}
work; print; {корректировка и чтение измененного файла}
readln
END.
Задание добавьте в ОСНОВНУЮ ПРОГРАММУ процедуры:
В процедуру «создания нового файла» исправьте на поэлементный ввод данных в файл, т.е. вводится не жестко – 10 элементов (записей) в файл, а столько сколько захочет пользователь, для этого надо добавить проверку на продолжение ввода новых данных, например:
write('Продолжить ввод данных? Y/N ');
…………………………………………….
writeln('Ввод новых данных закончен. Файл закрывается. ');
добавления новой записи в конец файла,
удаление записи из файла по заданному критерию, например по номеру в списке.
