Разработка класса для работы с двоичным файлом, страница 2

     int **pp=p;

порождают программные объекты, представленные на схеме на рис.1.

  pp

в

  p

а

.

.

.

.

.

в

в

в

в

в

  a

а

  11

  12

  13

  14

  15

Рис.1. Схема размещения переменных при объявлении.

При выполнении операции pp-p получим нулевое значение, так как ссылки pp и p равны и указывают на начальный элемент массива указателей, связанного с указателем p ( на элемент p[0]).

После выполнения операции pp+=2 схема изменится и примет вид, изображенный на рис.2.

  pp

в

  p

а

.

.

.

.

.

в

в

в

в

в

  a

а

  10

  11

  12

  13

  14

Рис.2. Схема размещения переменных после выполнения операции pp+=2.

Результатом выполнения вычитания pp-p будет 2, так как значение pp есть адрес третьего элемента массива p. Ссылка *pp-a тоже дает значение 2, так как обращение *pp есть адрес третьего элемента массива a, а обращение a есть адрес начального элемента массива a. При обращении с помощью ссылки **pp получим 12 - это значение третьего элемента


Функциональное описание.

ReallocAdresa(int*,int);

Расширение, сужение массива указателей. Этот метод необходим, когда мы вставляем или удаляем элемент массива Adresa.

CloseBinaryFile();

Закрывает двоичный файл, с которым связан объект класса.

Add(cstring);

Метод добавляет элемент в конец файла.

LoadAll(char*);

Загружает из двоичного файла в память указатели на все строки.

SetSz(int);

Установить размер двоичного файла.

cstring GetByNumer(int);

Метод находит соответствующий логическому номеру указатель на строку в файле и выгружает его по полученному указателю из файла в память.

DeleteString(int);

Удаляет строку по логическому номеру.

SaveAs(char*,char*);

Сохраняет данные из одного файла в другой.(из первого во второй)

ReSave();

Перезаписывает структуру. Обновленная структура хранится в файле noname.cw. Перезапись файла необходима, если, например, изменился порядок следования элементов или просто добавили элемент. При вставке, удалении мы работаем только с массивом указателей, не меняя расположения элементов в файле. Для того чтобы в дальнейшем сохранить последовательность элементов, мы должны обновить данные в файле соответственно с массивом указателей.

InsertByNumer(int,cstring);

Вставка по логическому номеру. Метод вызывает расширение массива указателей и на «лишнее» место записывает адрес нового элемента. Вставленная строка будете храниться в конце файла.

Edite(int);

Для  переменной класса cstring вызывается метод чтения из потока. Потом вызывается метод удаления старой строки, а затем вызывается вставка на место удаленного элемента.

void Sort(int, int);

Сортировка, методом Хоара(быстрая сортировка, сам метод подробно рассмотрен в теоретической части пояснительной записки). Сортируется массив указателей на строки в файле, по каждому указателю загружается строка и, если одна строка больше или меньше другой, соответственно меняются местами указатели на строки. Проще говоря, меняется логический номер строки. Но при этом сам файл никак не модифицируется. Для того, чтобы он соответствовал массиву указателей, его надо обновить.

GetSz();

Метод возвращает количество строк в двоичном файле.

SaveInsert(cstring);

Вставка с сохранением порядка. Сначала вставляем, потом сортируем. LoadFromTXT(char*);

Загрузка из текстового файла. Открываем текстовый файл, резервируем место в двоичном файле. Затем читаем из текстового файла по строке и записываем её в двоичный файл. Считаем количество строк в текстовом файле и записываем его в начало двоичного файла.

SaveToTXT(char*);

Сохранение в текстовый файл. Сначала проходим по структуре, сохраняем её в текстовый файл, а затем отмечаем конец файла меткой ~end~.

Show();

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