2012-03-28 64 views
0

我有一个包含大量数字的文件,每个数字之间用空格分隔。快速查找文件中的位置

诸如此类:124 1212 654 5 ... 74231

我怎样才能快速找到此文件中的第N个号?

我想是因为它是由字节为单位fseek()可能无法正常工作,而且我可以得到由第N号:

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

但我想可能有一些方法更有效?

+1

一旦你找到使用的fscanf和类似文件中的位置,你可以使用FTELL()来获取文件指针,它可以传递给FSEEK返回的字节位置那个位置非常瞬间。 – 2012-03-28 01:52:40

+0

@MarcB不幸的是,我不需要返回到我刚刚找到的号码。我可能会在找到成千上万的其他号码后返回。 – goofy 2012-03-28 02:02:02

+0

除非存储在文件中的数字具有某些属性(例如,它们全部是3位数字),否则唯一的方法是通读整个文件直到达到第N个整数。 – mfontanini 2012-03-28 02:02:08

回答

1

如果创建的文件,然后另外两个选项是:

  1. 打印在一个固定的宽度字段sufficie每个号码很宽以保持最大数量(例如, “%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) 
    
4

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

在索引中的条目可以看起来像: (文件偏移,数N)

索引可能看起来像: (文件偏移1,号1) (文件偏移2,编号2) 。 .. (文件偏移N,数N)