2012-02-20 1 views
2

'train-images-idx3-ubyte'파일을 읽으려고합니다. 해당 파일 형식 설명과 함께 here을 찾을 수 있습니다 (웹 페이지 하단). 내가 od -t x1 train-images-idx3-ubyte | less (16 진수 바이트 단위)와 바이트를 볼 때, 나는 다음과 같은 출력을 얻을 : 이것은 1에 따라 기대했던비트 읽기 퍼즐 (C++에서 이진 파일 읽기)

adress     bytes 
0000000 00 00 08 03 00 00 ea 60 00 00 00 1c 00 00 00 1c 
0000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
... 

입니다. 그러나 C++로 데이터를 읽으려고하면 문제가 생깁니다.

std::fstream trainingData("minst/train-images-idx3-ubyte", 
    std::ios::in | std::ios::binary); 
int8_t zero = 0, encoding = 0, dimension = 0; 
int32_t samples = -1; 
trainingData >> zero >> zero >> encoding >> dimension; 
trainingData >> samples; 
debugLogger << "training set image file, encoding = " 
    << (int) encoding << ", dimension = " 
    << (int) dimension << ", items = " << (int) samples << "\n"; 

그러나 이러한 코드 몇 줄의 출력은 다음과 같습니다 : 내가 할 것은 이것이다

training set image file, encoding = 8, dimension = 3, items = 0 

제외한 모든 인스턴스 (항목, 샘플)의 수는 정확합니다. 나는 다음 4 바이트를 int8_t로 읽으려고했지만 적어도 최소한 od과 같은 결과를 얻었다. 나는 samples이 0 일 수있는 방법을 상상할 수 없다. 내가 실제로 여기에서 읽고 싶었던 것은 10,000이었다. 어쩌면 당신은 단서가 있습니까?

+0

, 당신은 포맷되지 않은 사용되어야합니다 : 당신은 인텔 기반 컴퓨터에서 실행하는 경우 입력. – ildjarn

+2

은 이진 입력을 위해'istream :: read()'또는'istream :: get()'또는'istreambuf_iterator'를 사용합니다. –

답변

2

다른 답변에서 언급 한 것처럼 operator>> 대신 형식화되지 않은 입력 (예 : istream::read(...))을 사용해야합니다. 수율 읽어 사용하는 위의 코드를 번역 : 당신을 얻는다

trainingData.read(reinterpret_cast<char*>(&zero), sizeof(zero)); 
trainingData.read(reinterpret_cast<char*>(&zero), sizeof(zero)); 
trainingData.read(reinterpret_cast<char*>(&encoding), sizeof(encoding)); 
trainingData.read(reinterpret_cast<char*>(&dimension), sizeof(dimension)); 
trainingData.read(reinterpret_cast<char*>(&samples), sizeof(samples)); 

이 대부분의 방법 -하지만 빅 - 엔디안 형식처럼 당신의 감각을 만들 수 ntohl를 통해 통과해야하므로 00 00 ea 60이 보인다 제공

samples = ntohl(samples); 

인코딩 = 8, 차원이 = 당신은 형식화 된 입력을 사용하고 3, 항목 = 60000

+0

예, 내 문제가 완벽하게 해결되었으며 엔디안 형식에 대한 권리가 있습니다. 감사! – alfa

2

입력 형식이 잘못 지정되어 파일에서 잘못된 결과가 나옵니다. 포맷되지 않은 입력을 읽으면 올바른 결과가 제공됩니다.