Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

C++. Энциклопедия пользователя - Либерти Дж.

Либерти Дж. C++. Энциклопедия пользователя — Москва, 2001. — 581 c.
Скачать (прямая ссылка): enciklopediyapolzovatelya2001.djvu
Предыдущая << 1 .. 179 180 181 182 183 184 < 185 > 186 187 188 189 190 191 .. 280 >> Следующая

Index * plndex = new Index(GetPage(retVal)->GetFirstIndex()); pIndex->SetPointer(retVal); retVal = InsertLeaf(*plndex);
}
return retVal;
)
II вызывается, если текущая страница листовая int Page::FindLeaf(Indexs rlndex, bool findOnly)
(
int result = 0;
II без дубликатов!
for (int i=0; i < myVars .myCount; i++) if (rlndex = myKeys[i])
(
if (findOnly) II вернуть первый WNJ
//вернуть BTree::theWNJFile.Find(myKeys[i].GetPointer()); return myKeys[i].GetPointer();
else
return BTree::theWNJFile.Insert( rlndex.GetPointer(), myKeys[i].GetPointer());
1
if (findOnly) II не найдено
return result;
II Этот элемент индекса пока не существует,
// прежде чем поместить его в индекс,
// поместите запись в wnj.idx
II и установите индекс на эту запись.
rlndex.SetPointer(BTree::theWNJFile.Append(rlndex.GetPointer())); return InsertLeaf(rlndex);
Живучесть объектов
Глава 15
395
int Page::InsertLeaf(IndexS rlndex)
{
int result = 0;
if (myVars.myCount < Order)
Push(rlndex); else // страница переполнена
// сделать соседа int NewPg =
NewPage(myKeys,Order/2,myVars.IsLeaf,myVars.myCount);
Page* Sibling = GetPage(NewPg);
Nullify(Order/2); // обнулить праву» половину
// помещается ли на этой стороне?
if (myVars.myCount>Order/2-l SS rlndex <= myKeys[Order/2-1])
Push(rlndex); else // поместить в нового соседа Sibling->Push(rlndex);
result = NewPg; // разбиваем страницу
>
return result;
)
// помещаем новый индекс на эту страницу (в порядке) void Page::Push(Indext rlndex,int offset,bool first)
{
bool inserted = false; assert(myVars.myCount < Order);
for (int i-offset; iCOrder SS i<myVars.myCount; i++)
{
assert (myKeys [i] . GetPointer ()) ; if (rlndex <= myKeys[i])
<
Push(myKeys[i],offset+1,false); myKeys[i]=rlndex; inserted = true; break;
}
}
if (!inserted)
myKeys[myVars.myCount] = rlndex;
if (first)
myVars.myCount++;
}
void Page::Print()
{
if ('myVars.IsLeaf)
{
BTree::NodePageCtr++;
BTree::NodelndexPerPage[myVars.myCount]++;
BTree::NodeIndexCtr+=myVars.myCount;
I
else
{
BTree::LeafPageCtr++;
BTree::LeafIndexPerPage[myVars.myCount]++;
BTree::LeafIndexCtr+=myVara.myCount;
)
for (int i = 0; i<Order && i < myVars .myCount; i++)
{
assert(myKeys[i].GetPointer()); if (myVars.IsLeaf)
{
396
Живучесть объектов и шифрование
Часть IV
cout « "\nPage " « myVars .myPageNumber « myKeys[i].PrintKey();
}
else
{
cout « "\nPage " « myVars .myPageNumber « myKeys [i] .PrintPageO ;
)
}
}
/ / записываем всю страницу в виде блока fstream& Page::Write(fstreams file)
{
char buffer[PageSize]; memcpy(buffer,SmyBlock,PageSize); file. flush () ; file.clear();
file.seekp(myVars.myPageNumber*PageSize); file.write(buffer,PageSize); return file;
)
Листинг 15.14. WNY.cpp__________________________________________________
tinclude "btree.hpp" tinclude <assert.h>
// при конструировании пытаемся отхрыть файл, если тот существует WNJFile::WNJFile(): myFile("RACHELWNJ.IDX",
ios::binary | ios::in | ios::out | ios::nocreate)
{
for (int i = 0; i<5; i++) myints[i]=0L;
)
void HNJFile:-.Create()
{
char Header[2*SIZE_INT];
int MagicNumber=0; // число, которое мы можем проверить int zero = 0;
if (ImyFile) // сбой nocreate, первое создание файла {
// открываем файл и создаем его
myFile.clear();
myFile.open("RACHELWNJ.IDX",
ios::binary | ios::in | ios::out);
MagicNumber - 1234;
memcpy(Header,SMagicNumber,SIZE_INT); memcpy(Header+SIZE_INT,Szero,SIZE_INT); myFile.seekp(0);
myFile.write(Header,2*SIZE_INT);
myFile.flush();
return;
}
// мы отхрыли файл, он уже существует // получить необходимые нам числа
myFile.seekg(O);
myFile.read(Header,2*SIZE_INT);
memcpy(SMagicNumber,Header,SIZE_INT);
memcpy(SmyCount,Header+SIZE_INT,SIZE_INT);
II проверяем магическое число. Если оно неправильно,
II то файл поврежден или это не индексный файл
Живучесть объектов
Глава 15
397
if (MagicNumber ! = 1234)
{
// заменить на исключение! cout « "WNJ Magic number failed!”; cout « "Magic number; " « MagicNumber; cout « "\nmyCount: " « myCount « endl;
)
return;
>
// записать числа, которые понадобятся в следующий раз void WNJFileClose()
myFile.seekg(SIZE_INT);
myFile.write((char*)SmyCount,SIZE_INT); myFile.close();
}
int WNJFile::Append(int DataOffset)
{
int newPos = (N_ITEMS_IN_HEADER*SIZE_INT) // начальный заголовок + myCount++ * (N_DATA_SETS*SIZE_INT); // сколько наборов int offsets[N_DATA_SETS]; offsets[0] = DataOffset; for (int i = 1; i<N_DATA_SETS; i++) offsets[i]=0; myFile.seekg(newPos) ;
myFile.write((char*)offsets,N_DATA_SETS*SIZE_INT); return newPos;
)
int WNJFile::Insert(int DataOffset,int WNJOffset)
{
int ints [5];
myFile.seekg(WNJOffset);
myFile.read((char*)ints,5*SIZE_INT);
int offset=WNJOffset;
while (ints[4])
offset = ints[4];
myFile.clear();
myFile.flush();
myFile.seekg(ints[4]) ;
myFile.read((char*)ints,5*SIZE_INT) ;
)
if (ints[3]) II заполнен!
{
ints[4] = Append(DataOffset); myFile.clear(); myFile.flush(); myFile.seekg(offset);
myFile.write((char*)ints,5*SIZE_INT);
Предыдущая << 1 .. 179 180 181 182 183 184 < 185 > 186 187 188 189 190 191 .. 280 >> Следующая