2

次のように配置された(符号付き数値の)データを含むファイルがあります。

   291
 -1332
   912
   915
 -1347
   196
  1110
  -997
   120
  1017
  -775
  -443
   985
    13
  -690
   369
   673
  -826
   -14
   891
  -546...(thousands of lines)

ファイルポインタをex.1100の特定の行番号に移動する関数を使用したい

現在、次のコードを使用してスキップして特定の行/番号に移動しています

if (offset>0)//offset is number of destination line
{
 while(fscanf(f,"%d",&buffer)!=EOF) //f is file pointer ;Buffer is int variable
   { 
    i++;
    if(i==offset)
            break;
    }

}

このコードはオフセットが増加するにつれて時間がかかるため、これよりも優れたコードを使用したいのですが、これを簡単な方法で (そしてより短い時間で) 実装するためのアイデアはありますか?

4

2 に答える 2

1

すべての数字が (たとえば) 6 文字の長さで、\n各行の終わりに 1 つの改行文字がある場合n、 fseeking to によって行番号 (0 から始まる) を取得できn * 7ます。行 0 はオフセット 0、行 1 はオフセット 7、行 2 はオフセット 14 などです。

同様に、1100 行目 (1101 行目) は次のように取得できます。

if (fseek (f, 7700L, SEEK_SET) != 0) {
    // something went wrong.
}
if (fscanf (f, "%d", &buffer) != 1) {
    // something else went wrong.
}

これは任意の固定幅の行で機能します。行の幅と行末に基づいて倍率を調整するだけです (たとえば、DOS エンコーディングには2 つの文字が含まれる場合があります\r\n)。

もちろん、データへのランダム アクセスが驚くほど高速になるように、ファイル全体をメモリ内の整数配列に読み込むだけのほうが有利な場合があります (数千の数に応じて異なります)。初期ロード後のデータ用のファイル。

于 2013-09-25T06:26:32.387 に答える