seekg,大文件失败

时间:2014-11-25 12:50:00

标签: c++ c binaryfiles seekg

我有一个非常大的(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输入了一个巨大的数据流(数十亿)的输入类型。

1 个答案:

答案 0 :(得分:1)

更改行

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

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

解决了这个问题。