2014-11-25 43 views
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類型。

+0

主要問題是你使用'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

+0

你的整數是32位嗎?也許整數數學'index * length * sizeof(float)'溢出。 – drescherjm 2014-11-25 12:55:28

+0

您的意見是正確的。添加(streamoff)投射問題已解決。我認爲演員陣容是自動的,因爲seekg採取流派型 – David 2014-11-25 13:30:55

回答

1

更改線路

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

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

解決了這個問題。