0

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

如:124 1212 5 654 74231 ...

如何快速找到此文件中的第 N 个数字?

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

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

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

4

2 回答 2

5

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

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

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

于 2012-03-28T02:03:22.493 回答
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)
    
于 2012-03-28T02:31:24.453 回答