В памяти бинарный поиск Vs.Бинарный поиск на диске - PullRequest
0 голосов
/ 03 сентября 2011

В этой программе я читаю файл «key.pc.db» и печатаю его среднее значение.

#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/stat.h>
using namespace std;
int main( int argc, char *argv[] )
{
        ifstream  fp;     
        int mval;
        int sizek;
        struct stat filek;
        int min, max, mid;
        if(stat("key.pc.db", &filek) ==0 )
             sizek=filek.st_size;
        sizek=sizek/sizeof(int);
        min=0;
        max=sizek-1;
        mid=(min+max)/2;    
        printf("mid %d ",mid);
        fp.open( "key.pc.db", ios::in | ios::binary ); 
        fp.seekg(mid, ios::beg);
        fp.read( (char *) &mval, (int) sizeof( int ) );
        printf("%d mval ", mval);
        getch();
        return 1;
}

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

#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <sys/stat.h>
using namespace std;
int main( int argc, char *argv[] )
{
        ifstream  fp;     
        int index;
        int sizek;
        int kval;
        struct stat filek;
        int min, max, mid;
        int i=0;
        if(stat("key.pc.db", &filek) ==0 )
             sizek=filek.st_size;
        sizek=sizek/sizeof(int);
        int k[sizek];
        fp.open( "key.pc.db", ios::in | ios::binary );  
        fp.read( (char *) &kval, (int) sizeof( int ) );
        while( !fp.eof() ) 
         {
               k[i++]=kval;
               fp.read( (char *) &kval, (int) sizeof( int ) );
         }
        min=0;
        max=sizek-1;
        mid=(min+max)/2;
        printf(" index %d ", mid);
        printf(" kmid %d ", k[mid]);
        getch();
        return 1;
}

1 Ответ

4 голосов
/ 03 сентября 2011

Вы ищете неправильную точку в файле в первом случае.Вы должны стремиться к mid*sizeof(int), а не mid.

...