快速搜索文件中的位置

时间:2012-03-28 01:50:14

标签: c++ c file scanf fseek

我有一个包含大量数字的文件,每个数字都用空格分隔。

如:124 1212 5 654 74231 ...

如何快速找到此档案中的第N个号码?

我认为fseek()可能不起作用,因为它是按字节计算的,我可以通过以下方式得到第N个数字:

 int i;
 for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable);

但我想可能有某种方式更有效率?

2 个答案:

答案 0 :(得分:5)

读取整个文件一次,并为文件中的某些数据点创建索引(例如1000个点)。索引中的每个条目都可以将文件中的位置映射到从该位置开始的第N个数字。构建该索引后,每次查找第N个数字时,首先在索引中找到最接近的条目,该条目告诉您文件中距离fseek最近的已知点。然后使用fscanf执行搜索以查找值。这减少了搜索时间,并为索引使用了一些内存。

索引中的条目可能如下所示:  (文件偏移,数字N)

索引可能如下所示:  (文件偏移量1,数字1)  (文件偏移2,数字2)  ...  (文件偏移量N,数量N)

答案 1 :(得分:1)

如果您创建文件,则另外两个选项是:

  1. 在固定宽度字段中打印足够宽的每个数字以保留最大数字(例如“%5d”),然后将fseek(somefile,(N-1)*6,SEEK_SET)打印到数字N.

  2. 如果文件不需要是人类可读的,您可以fwrite()整数作为二进制数据而不是ASCII字符到文件中并使用

    访问它们
    fseek(somefile,(N-1)*sizeof(int),SEEK_SET)
    fread(&variable,sizeof(int),1,somefile)