2014-11-25 3 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 순서를 말할 그러므로하자 내 파일의 세번째 순서) 그래서 나는 다음과 같은 코드를 사용

#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는 입력이 엄청나게 많은 수십억 개의 스트림 오프 형식을 사용한다는 것을 알았습니다.

+0

큰 문제는 오프셋에'int'를 쓰는 반면, [seekg'] (http://en.cppreference.com/w/cpp/io/basic_istream/seekg)는'off_type' 또는' pos_type'은'int'의 별칭이 아닌 (아마도 64 비트 정수형 인 std :: size_t의 가능성이 높습니다). 모든 주요 현대적인 플랫폼에서, 심지어 64 비트 플랫폼에서,'int'는 여전히 32 비트 타입이며, 큰 수에는 적합하지 않습니다. –

+0

정수가 32 비트입니까? 아마도 정수 수학'index * length * sizeof (float)'이 넘쳐 흐르고있을 것입니다. – drescherjm

+0

귀하의 의견은 모두 맞습니다. (스트림 오프) 캐스트를 추가하면 문제가 해결됩니다. 나는 seekg가 streamoff 형식을 취하기 때문에 자동 형 변환이라고 생각했다. – David

답변

1

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

에 선

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

을 변경하여 문제를 해결했다.

관련 문제