2012-03-28 103 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)