快速查找文件中的位置

Quickly seek a location in a file

本文关键字:位置 文件 查找      更新时间:2023-10-16

我有一个文件,里面有很多数字,每个数字都用一个空格隔开。

例如:124 1212 5 654 74231。。。

如何快速定位此文件中的第N个数字?

我认为fseek()可能不起作用,因为它是以字节为单位测量的,我可以通过获得第N个数字

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

但我想可能有更有效的方法?

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

索引中的条目可能看起来像:(文件偏移量,编号N)

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

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

  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)