Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

9.9. Организация файла с произвольным доступом

Файл, в котором доступ к любой записи выполняется без доступа к предшествующим записям, называется файлом с произвольным доступом. Для работы с файлами с произвольным доступом кроме рассмотренной ранее функции seekp, используются функции seekg, tellp, tellg.

Функция seekg перемещает указатель считывания файла относительно заданной вторым операндом функции позиции на определенное первым параметром количество байтов.

Синтаксис вызова функции seekg:

f.seekg(смещение в байтах, заданная позиция)

где f – файловая переменная.

Функция tellp определяет текущую позицию указателя записи от начала файла, а функция tellg – позицию указателя считывания. Значение позиции задается в байтах.

Синтаксис вызова функций tellp и tellg:

f. tellp()

f.tellg()

Необходимым условием организации файла с произвольным доступом является одинаковая длина всех записей файла. Кроме того каждая запись файла должна иметь уникальное значение некоторого поля или совокупности полей. Минимальное количество полей записи, значение которых однозначно определяет запись, в файле называется первичным ключом. Так записи двоичного файла с информацией о муниципальных округах имеют одинаковую длину, а номер муниципального округа является певичным ключом записей файла. Если номерам муниципальных округов присвоены значения от 1 до 123, то при расположении записей в файле по возрастанию значений номеров муниципальных округов, адрес записи (номер байта от начала файла) можно определить по формуле:

(Номер муниципального округа -1) * длина записи

Для такой организации файла можно реализовать прямой доступ к записи по номеру муниципальнго округа. В программе на языке С++ позицию чтения информации о заданном муниципальном округе в файле можно установить с помощью функции seekg, смещение в которой относительно начала файла можно задать по приведенной выше формуле.

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

void read_record(char file_name[], int n)

{

mo m;

ifstream f; //файловый поток

f.open(“mo.mos”, ios::in|ios::binary); //открытие файла для чтения

//Перемещение указателя к записи

f.seekg((n-1)*(sizeof m),ios::beg);

f.read((char*)&m,sizeof m); //чтение записи

cout<<m.number<<’ ‘<<m.name<<’ ‘<<m.ao<<’ ‘<<m.tel;

f.close();

}

10. Данные с динамической структурой

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

10.1. Линейный список

Линейный список – это последовательность элементов, как правило, одного типа. Элементы в списке упорядочены по положению: элемент в списке из n элементов a1, а2, …аn может занимать одно из положений от 1 до n. Каждый элемент аi имеет предшествующий (кроме первого) и последующий (кроме последнего) элементы. Над линейным списком выполняются операции: вставка элемента, исключение элемента, поиск, упорядочивание, просмотр, очистка и другие.

Структура данных в виде линейного списка используется во многих прикладных задачах, например, при учете товаров на складе, продаже и резервировании билетов на самолеты. В программировании используют два способа хранения элементов линейного списка в оперативной памяти:

  • в массиве;

  • в связанном указателями списке структур.

Способ хранения определяет способ программной реализации структуры данных.