1

ファイルから配列を読み取る必要があります。配列はファイル内で連続して順序付けられていないため、次の要素を取得するには「オフセット」バイトをジャンプする必要があります。非常に大きなファイルを読み取ると仮定すると、より効率的です。

1) 増分相対位置を使用します。
2) 絶対位置を使用します。

オプション1:

int var[N];
seekg(0);
for (int i=0; i<N; i++) {
  file.read( (char*) var+i, sizeof(int))
  seekg(offset,ios_base::cur);
}

オプション 2:

int var[N];
for (int i=0; i<N; i++) {
  file.seekg(offset*i);
  read( (char*) var+i, sizeof(int))
}
4

2 に答える 2

2

readすでに位置を進めているため、ループ内をシークする必要はありません。さらに、配列はメモリ内で連続して配置されるため、次のように言うことができます。

std::vector<int> var(N);

auto res = file.read(reinterpret_cast<char*>(var.data()), sizeof(int) * var.size());

後でresとの値を確認してください。file

if (!file || res != sizeof(int) * var.size())
{
     // an error occurred
}

ファイルのランダムな部分から読み取る場合、シーク方法に違いはありません (ファイルは基本的に「ランダム アクセス」です)。ただし、エラーをキャッチするために、読み取りごとに必ず上記のテストを実行してください。

于 2013-07-06T18:07:30.480 に答える
0

私はそれがまったく違いを生まないことを99.9%確信しています(絶対的なケースではなく、相対的なケースでバイトを前方にoffset移動したという事実に合わせて正しく調整する必要があるという点での正確さは別として。両方でsizeof(int)ファイル内の現在の位置を移動するシークを行います. それを処理するファイルシステム内の実際のコードは、最終的に現在の位置から計算することによって絶対位置に移動しios_base::curます.

どちらが優れているかを知ることが本当に重要な場合は、2 つのオプションのベンチマークを行ってください。しかし、ファイルシステムの実際のシーク関数内ではまったく違いがないと確信しています。これは、次に読み取る (または書き込む) ファイル内の場所を追跡する大きな整数 (おそらく 64 ビット) です。

于 2013-07-06T18:16:04.303 に答える