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; просмотров: 914;