2012-03-28 8 views
0

大量のファイルがあり、各番号はスペースで区切られています。ファイル内の場所をすばやく探します。

ようなのような:124 1212 5 654 74231 ...

どのように私はすぐにこのファイル内のN番目の番号を見つけることができますか?

私はそれはバイトで測定しているためfseek()が動作しないかもしれないと思う、と私はでN番目の番号を取得することができます:

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

しかし、私は、より効率的ないくつかの方法があるかもしれないと思いますか?

+1

、あなたはftellは()あなたはに戻るためにFSEEKに渡すことができますファイルポインタのバイト位置を取得するために使用することができますその場所はかなり瞬時に。 –

+0

@MarcB残念ながら、私は今見つかった番号に戻る必要はありません。他の数十万もの番号を見つけた後に戻ることがあります。 – goofy

+0

ファイルに格納されている数値にプロパティがない場合(たとえば3桁の長さの場合など)、唯一の方法はN番目の整数に達するまでファイル全体を読み取ることです。 – mfontanini

答えて

1

ファイルを作成する場合は、他の2つのオプションは以下のとおりです。

  1. 印刷固定幅フィールドsufficieの各数最大の数字(たとえば、 「%5dの」)ファイルが読める人間である必要がない場合には、fseek(somefile,(N-1)*6,SEEK_SET)番号N.

  2. に位置するには、ファイルにバイナリデータの代わりのASCII文字として整数をfwrite()とでそれらにアクセスすることができあなたが関数fscanfなどを使用してファイル内の場所を見つけたら

    fseek(somefile,(N-1)*sizeof(int),SEEK_SET) 
    fread(&variable,sizeof(int),1,somefile) 
    
4

ファイル全体を一度読んで、ファイル内のいくつかのデータポイント(たとえば1000ポイント)のインデックスを作成します。インデックス内の各エントリは、ファイル内の場所をその場所から始まるN番目の番号にマップできます。そのインデックスを構築したら、N番目の番号を探すたびに、最も近い既知の点を示す索引に最も近い項目を見つけてください。fseek。値を見つけるためにfscanfを使用して検索を実行してください。これにより、検索時間が短縮され、索引にメモリーを使用するコストがかかります。

インデックス内のエントリは次のように見ることができる:(ファイルは、数1を1オフセット) は (ファイルは、数2を2オフセット) : (ファイルオフセット、数N)

指数は次のように見えることができます。 ... (ファイルN、N数をオフセット)

関連する問題