Файлы с последовательным и прямым доступом.




Цель работы: Получение навыков в организации файлов на внешних носителях и использование их для обработки информации.

 

Задание:

1 Организовать ввод данных с клавиатуры и запись их в файл(ы) с прямым доступом.

2 Прочитать данные из файла(ов), произвести необходимые вычисления и результаты записать в файл с

последовательным доступом.

3 Вывести результаты работы программы на экран, прочитав файл результатов.

Методические указания

Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы формирования (записи) компонент файла и просмотра (чтения) не могут произвольно чередоваться. Таким образом, файл вначале строится при помощи последовательного добавления компонент в конец, а затем может последовательно просматриваться от начала до конца.

Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ.

Турбо Паскаль позволяет применять к компонентным и бестиповым файлам, записанным на диск, способ прямого доступа. Прямой доступ означает возможность заранее определить в файле блок, к которому будет применена операция ввода-вывода. В случае бестиповых файлов блок равен размеру буфера, для компонентных файлов блок – это одна компонента файла.

Прямой доступ предполагает, что файл представляет собой линейную последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 через 1 до n. Кроме того, вводится понятие условной границы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 1 расположена перед блоком с номером 2 и, наконец, условная граница с номером n находится после блока с номером n.

Реализация прямого доступа осуществляется с помощью функций и процедур FileSize, FilePos, Seek и Truncate.

Функция FileSize (var f): Longint возвращает количество блоков в открытом файле f.

Функция FilePos (var f): Longint возвращает текущую позицию в файле f. Позиция в файле – это номер условной границы. Для только что открытого файла текущей позицией будет граница с номером 0. Это значит, что можно записать или прочесть блок с номером 1. После чтения или записи первого блока текущая позиция переместится на границу с номером 1, и можно будет обращаться к блоку с номером 2. После прочтения последней записи значение FilePos равно значению FileSize.

Процедура Seek (var f; N: Longint) обеспечивает назначение текущей позиции в файле (позиционирование). В параметре N должен быть задан номер условной границы, предшествующей блоку, к которому будет производиться последующее обращение. Например, чтобы работать с блоком 4, необходимо задать значение N, равное 3. Процедура Seek работает с открытыми файлами.

Процедура Truncate (var f) устанавливает в текущей позиции признак конца файла и удаляет (стирает) все последующие блоки.

Таблица 8

Вариант задания Задание
  Сформировать файл из некоторых чисел. Записать во второй файл количество положительных, отрицательных и нулевых элементов файла.
  Сформировать два файла из некоторых чисел. Получить третий файл, в который сначала записать элементы второго файла, а затем первого.
  Сформировать два файла из некоторых чисел. Записать в третий файл положительные элементы первого и второго файлов.
  Сформировать файл из некоторых чисел. Записать во второй файл сначала положительные, а потом отрицательные элементы первого файла
  Сформировать два файла из некоторых чисел. Записать в третий файл положительные элементы первого файла и отрицательные элементы второго.
  Сформировать два файла из некоторых чисел. Записать в третий файл нулевые элементы первого файла и четные элементы второго.  
  Сформировать файл из некоторых чисел. Записать во второй файл положительные элементы первого файла, а в третий – отрицательные элементы первого файла.  
    Сформировать два файла из некоторых чисел. Записать в третий файл положительные элементы второго файла и отрицательные элементы первого.
  Сформировать два файла из некоторых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго.
  Сформировать файл из некоторых чисел. Записать во второй файл из первого максимальный отрицательный элемент, в третий – минимальный положительный.
  Сформировать два файла из некоторых чисел. Определить, в каком файле больше положительных элементов и результат записать в третий файл.
  Сформировать два файла из некоторых чисел. Записать в третий файл положительные элементы того файла, в котором находится максимальное отрицательное число.
  Сформировать файл из некоторых чисел. Записать во второй файл элементы первого файла с четными номерами, в третий – с нечетными.
  Сформировать файл из некоторых чисел. Записать во второй файл все положительные элементы первого, а затем абсолютные величины отрицательных элементов.
  Сформировать два файла из некоторых чисел. Записать в третий файл два первых элемента первого файла и два последних элемента второго.
  Сформировать два файла из некоторых чисел. Записать в третий файл последний положительный элемент первого файла и первый отрицательный второго.

Пример программы на Паскале:

{ Сформировать файл из некоторых чисел. }

{ Записать во второй файл количество положительных, }

{ отрицательных и нулевых элементов файла. }

uses CRT; { Подключение библиотеки ввода-вывода }

const n=10; { Максимальный размер массива }

{ Раздел объявления переменных }

var

File1, File2: FILE of Integer; { Переменные файлового типа }

Road1, Road2: String[14]; { Строки для хранения имен файлов }

a: Array[1..n] of Integer; { Массив для хранения введенных чисел }

i, pol, otr, nul: Integer; { i-счетчик цикла }

{ pol-количество положительных элементов массива}

{ otr количество отрицательных элементов массива}

{ nul количество нулевых элементов массива}

{ Основной блок программмы }

begin

ClrScr; { Очистка экрана }

WriteLn('Выполнил Поляков Д.Г., КТФ, гр. Р-11');

Road1:='Test1.dat'; { Задание имен файлов }

Road2:='Test2.dat';

Assign(File1,Road1); { Связь файловой переменной с внешним файлом Road1}

Rewrite(File1); { Создание и открытие файла Test1.dat }

Assign(File2,Road2); { Связь файловой переменной с внешним файлом Road2}

Rewrite(File2); { Создание и открытие файла Test2.dat }

pol:=0; { Инициализация переменных }

otr:=0;

nul:=0;

for i:=1 to n do

begin

WriteLn('Введите ',i,' элемент массива'); { Запрос у пользователя

элементов массива}

Read(a[i]); { Ввод элементов массива }

Write(File1,a[i]); { Запись их в файл Test1.dat }

end;

Close(File1); { Закрытие файла Test1.dat }

WriteLn; { Пропуск строки }

WriteLn('____________________________________');

Reset(File1); { открытие файла Test1.dat для проверки правильности записи }

while not eof(File1) do { Чтение файла до тех пор, пока указатель }

{ текущей компоненты файла находится перед }

{ последней компонентой файла }

begin

Read(File1,a[i]); { Считывание чисел из файла }

Write(a[i]:2); { Распечатка считываемых чисел }

if a[i]>0 then pol:=pol+1; { Подсчет числа положительных, отрицательных}

if a[i]<0 then otr:=otr+1; { и нулевых элементов }

if a[i]=0 then nul:=nul+1;

Inc(i); { Приращение счетчика цикла }

end;

WriteLn; { Пропуск строки }

WriteLn('____________________________________');

Write(File2,pol); { Запись числа положительных, отрицательных }

Write(File2,otr); { и нулевых элементов в файл Test2.dat }

Write(File2,nul);

Close(File2); { Закрытие файлов Test1.dat и Test2.dat }

Close(File1);

Assign(File2,Road2); { Открытие файла Test2.dat }

Reset(File2); { для проверки правильности записи и печати результатов}

Read(File2,pol); WriteLn('Количество положительных: ',pol:3);

Read(File2,otr); WriteLn('Количество отрицательных:',otr:3);

Read(File2,nul); WriteLn('Количество нулевых:',nul:3);

Close(File2); { Закрытие файла Test2.dat }

ReadKey; { Задержка экрана }

end.

Содержание отчёта по лабораторной работе.

 

1 Цель лабораторной работы.

2. Задание.

3. Методические указания.

4. Блок-схема алгоритма программы.

5. Текст программы.

6. Результаты расчетов.

Контрольные вопросы.

1 Последовательный доступ.

2 Прямой доступ.

3 Понятие условной границы между блоками.

4 С помощью каких функций и процедур осуществляется реализация прямого доступа?

5 Можно ли просмотреть компоненту с номером N, при условии что до этого не было просмотрена N-1 компонента?

6 В каком случае блок равен размеру буфера?

7 Функция FileSize (var f): Longint.

8 Функция FilePos (var f): Longint

9 Процедура Seek (var f; N: Longint).

10 Процедура Truncate (var f).



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: