Unsigned long izon, jzon;

Int nByte;

h=_rtl_open(FileName, O_RDWR); // открытие бинарного файла

if(h<0) return 1; // не удалось открыть файл

FileSize=lseek(h,0L,SEEK_END);

if(RecLen*(FileSize/RecLen)!=FileSize) {

close(h); // размер файла не кратен длине записи

Return 2;

}

ZonSize=(MemSize/RecLen/2)*RecLen;

nZon=FileSize/ZonSize;

if(nZon*ZonSize!=FileSize){ // последняя зона неполная

nZon++;

}

if(ZonSize<RecLen){

Close(h);

return 3; // мало дали памяти

}

Buffer=new char[2*ZonSize+1];

if(Buffer==NULL) {

Close(h);

return 4; // нет памяти

}

Buffer[2*ZonSize]=0;

for(izon=nZon-1; izon>1; izon--){ // проходы по файлу

// izon - число зон в данном проходе

// читать первые две зоны

Lseek(h, 0L, SEEK_SET);

nByte=_rtl_read(h, Buffer, 2*ZonSize);

for(jzon=0; jzon < izon-1; jzon++){

// сортировать

qsort(Buffer, nByte/RecLen, RecLen, cmp);

// нижнюю половину - в зону jzon

lseek(h, jzon*ZonSize, SEEK_SET);

_rtl_write(h, Buffer, ZonSize);

// подкачать следующую зону

lseek(h, (jzon+2)*ZonSize, SEEK_SET);

nByte=_rtl_read(h, Buffer, ZonSize);

// если прочитано меньше ZonSize,

// то верхнюю половину сдвинуть вниз

// на ZonSize-nByte вплотную к нижней

if(nByte < ZonSize){

for(i=0; i<ZonSize; i++){

Buffer[nByte+i]=Buffer[ZonSize+i];

}

}

nByte+=ZonSize;

}

// переписать пузырек

qsort(Buffer, nByte/RecLen, RecLen, cmp);

lseek(h, (izon-1)*ZonSize, SEEK_SET);

_rtl_write(h, Buffer, nByte);

}

// две первых зоны








Дата добавления: 2014-12-02; просмотров: 921;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.