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

ファイル全体を 1 回読み取り、ファイル内のいくつかのデータ ポイント (たとえば 1000 ポイント) へのインデックスを作成します。index の各エントリは、ファイル内の場所をその場所から始まる N 番目の番号にマップできます。そのインデックスを作成すると、N 番目の番号を探すたびに、最初にインデックス内の最も近いエントリを見つけます。これにより、ファイル内で最も近い既知のポイントを知ることができますfseek。次に、を使用して検索を実行fscanfし、値を見つけます。これにより、インデックスにメモリを使用する代わりに検索時間が短縮されます。

インデックス内のエントリは次のようになります: (ファイル オフセット、数値 N)

インデックスは次のようになります: (ファイル オフセット 1、数値 1) (ファイル オフセット 2、数値 2) ... (ファイル オフセット N、数値 N)

于 2012-03-28T02:03:22.493 に答える
1

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

  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 に答える