0
我有一个非常大的(950GB)二进制文件,其中存储了10亿个浮点序列。seekg,在大文件上失败
我有长度的序列的文件的类型的一个小例子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需要输入一个很大(数十亿亿)的streamoff类型。
主要问题是你使用'int'作为偏移量,而['seekg'](http://en.cppreference.com/w/cpp/io/basic_istream/seekg)期望'off_type'或' pos_type',它们最有可能*不是'int'的别名(但很可能是'std :: size_t',它可能是一个64位整数类型)。在所有主流的现代化平台上,即使在64位平台上,“int”仍然是32位类型,这对于如此庞大的数字来说是不够的。 – 2014-11-25 12:55:22
你的整数是32位吗?也许整数数学'index * length * sizeof(float)'溢出。 – drescherjm 2014-11-25 12:55:28
您的意见是正确的。添加(streamoff)投射问题已解决。我认为演员阵容是自动的,因为seekg采取流派型 – David 2014-11-25 13:30:55