0

非常に大きな (950GB) バイナリ ファイルがあり、10 億の浮動小数点シーケンスを格納しています。

長さ 3 のシーケンスで私が持っているファイルの種類の小さな例は次のようになります。

-3.456 -2.981 1.244
2.453 1.234 0.11
3.45 13.452 1.245
-0.234 -1.983 -2.453

ここで、特定のシーケンス (インデックス = 2 のシーケンス、したがってファイル内の 3 番目のシーケンスとしましょう) を読み取りたいので、次のコードを使用します。

#include <iostream>
#include <fstream>
#include <stdlib.h>

using namespace std;

int main (int argc, char** argv){

  if(argc < 4){
    cout << "usage: " << argv[0] << " <input_file> <length> <ts_index>" << endl;
    exit(EXIT_FAILURE);
  }

  ifstream in (argv[1], ios::binary);
  int length = atoi(argv[2]);
  int index = atoi(argv[3]);

  float* ts = new float [length];

  in.clear();
  **in.seekg(index*length*sizeof(float), in.beg);**
  if(in.bad())
    cout << "Errore\n";
  **// for(int i=0; i<index+1; i++){**                                                                                                                
  in.read(reinterpret_cast<char*> (ts), sizeof(float)*length);
  **// }**                                                                                                                                            
  for(int i=0; i<length; i++){
    cout << ts[i] << " ";
  }

  cout << endl;
  in.close();
  delete [] ts;
  return 0;
}

問題は、seekg を使用すると、一部のインデックスでこの読み取りが失敗し、間違った結果が得られることです。ファイルをシーケンシャルに (seekg を使用せずに) 読み取り、代わりに目的のシーケンスを出力すると、常に正しい結果が得られます。

最初は、seekg のオーバーフローについて考えました (バイト数が非常に大きくなる可能性があるため) が、seekg が巨大な (数十億) ストリームオフ タイプの入力を受け取ることがわかりました。

4

1 に答える 1

1

ラインの変更

in.seekg(index*length*sizeof(float), in.beg);

の中へ

in.seekg((streamoff)index*length*sizeof(float), in.beg);

問題を解決しました。

于 2014-11-25T13:32:29.747 に答える