我有一個包含大量數字的文件,每個數字之間用空格分隔。快速查找文件中的位置
諸如此類:124 1212 654 5 ... 74231
我怎樣才能快速找到此文件中的第N個號?
我想是因爲它是由字節爲單位fseek()
可能無法正常工作,而且我可以得到由第N號:
int i;
for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable);
但我想可能有一些方法更有效?
我有一個包含大量數字的文件,每個數字之間用空格分隔。快速查找文件中的位置
諸如此類:124 1212 654 5 ... 74231
我怎樣才能快速找到此文件中的第N個號?
我想是因爲它是由字節爲單位fseek()
可能無法正常工作,而且我可以得到由第N號:
int i;
for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable);
但我想可能有一些方法更有效?
如果創建的文件,然後另外兩個選項是:
打印在一個固定的寬度字段sufficie每個號碼很寬以保持最大數量(例如, 「%5D」),然後fseek(somefile,(N-1)*6,SEEK_SET)
定位到數N.
如果該文件並不需要是人類可讀的,你可以fwrite()
整數作爲二進制數據,而不是ASCII字符的文件,並訪問它們
fseek(somefile,(N-1)*sizeof(int),SEEK_SET)
fread(&variable,sizeof(int),1,somefile)
讀取整個文件一次,併爲文件中的某些數據點創建索引(例如1000點)。索引中的每個條目都可以將文件中的位置映射到從該位置開始的第N個編號。建立索引後,每次查找第N個數字時,首先在索引中找到最接近的條目,告訴您文件中最接近的已知點,您可以使用fseek
。然後使用fscanf
執行搜索以查找值。這可以減少搜索時間,同時爲索引使用一些內存。
在索引中的條目可以看起來像: (文件偏移,數N)
索引可能看起來像: (文件偏移1,號1) (文件偏移2,編號2) 。 .. (文件偏移N,數N)
一旦你找到使用的fscanf和類似文件中的位置,你可以使用FTELL()來獲取文件指針,它可以傳遞給FSEEK返回的字節位置那個位置非常瞬間。 – 2012-03-28 01:52:40
@MarcB不幸的是,我不需要返回到我剛剛找到的號碼。我可能會在找到成千上萬的其他號碼後返回。 – goofy 2012-03-28 02:02:02
除非存儲在文件中的數字具有某些屬性(例如,它們全部是3位數字),否則唯一的方法是通讀整個文件直到達到第N個整數。 – mfontanini 2012-03-28 02:02:08