c++ - 在内存中二进制搜索与。基于磁盘的二进制搜索

标签 c++ filestream binary-search

在这个程序中,我正在读取“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;
}

最佳答案

在第一种情况下,您正在寻找文件中的错误点。您应该寻求 mid*sizeof(int) 而不是 mid

关于c++ - 在内存中二进制搜索与。基于磁盘的二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291077/

相关文章:

c++ - 使用 tie 从元组中分配 2 个 lambda

c++ - 处理大量

python - 为什么我不能为递归二进制搜索函数设置默认参数?

c# - 日期 <= n 的最大日期的二进制搜索日期列表

c++ - 如何选择特定的函数重载?

encryption - 加密 FILESTREAM 数据的最佳方法?

sql-server-2008 - SQL Server 2008 FILESTREAM 进度指示器

linux - 目标是从显示信息中提取视频驱动程序版本,然后将其与支持的版本列表进行比较

algorithm - 根据开始时间排序的给定间隔集。在 O(logn) 中计算其中包含时间 "T"的所有间隔

c++ - GLSL无法编译没有插值的着色器(平面)