2014-02-26 2 views
1

여기 단순히 짧은 INT의 순서, 각 사이즈의 2 바이트아르마딜로 매트릭스에 이진 파일을 읽는 간단한 방법?

0000000: 0100 0200 0300 0400 0500 0600 0700 0800 ................ 
0000010: 0900 0a00 0200 0400 0600 0800 0a00 0c00 ................ 
0000020: 0e00 1000 1200 1400 0300 0600 0900 0c00 ................ 
0000030: 0f00 1200 1500 1800 1b00 1e00   ............ 

test.bin xxd의 결과이다.

이제 마음에두고있는 것은 arma::Mat<short>을 만든 다음 파일을 2 바이트 씩 읽은 다음 비트 전환으로이 두 바이트를 짧은 int로 변환 한 다음 매트에 할당합니다.

이 방법이 효과적 일 수 있지만 지루한 것처럼 보이지만 더 좋은 방법이 있습니까?

답변

1

, 내가 함께 온 다음

#include <sys/stat.h> 
#include <stdint.h> 
#include <armadillo> 

int main() 
{ 
    struct stat statbuf; 
    stat("bigmat.bin", &statbuf); 
    uintmax_t fsize = (uintmax_t)statbuf.st_size; 
    uintmax_t bsize = fsize/sizeof(short); 
    short buffer[bsize]; 
    FILE *fp = fopen("bigmat.bin", "rb"); 
    fread((void*) buffer, 1, fsize, fp); 
// for(uintmax_t i=0; i<bsize; i++) { 
//  printf("%hd \n", buffer[i]); 
// } 

    arma::Mat<short> mymat(buffer, 10, 3, false); 
    std::cout << mymat << std::endl; 
    return 0; 
} 
1

전체 파일을 짧은 배열로 읽을 수 있습니다. 예 :

#define BUF_SIZE 12345; 
short int buffer[BUF_SIZE]; 

FILE *fp= fopen("test.bin", "rb"); 
int nread= fread((void *)buffer, 1, BUF_SIZE, fp); 

C++을 사용하고 있기 때문에 파일 크기를 읽고 버퍼를 동적으로 만들 수 있습니다. 여전히 little/big 엔디안을 개별적으로 변환해야합니다.

TonyWilk에서 힌트
관련 문제