将二进制文件读入犰狳矩阵的直接方法?

时间:2014-02-26 23:12:59

标签: c++ casting io armadillo

这是xxd test.bin

的结果
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            ............

它只是一个short int序列,每个大小为2个字节。

我现在要记住的是创建一个arma::Mat<short>,然后在文件中读取两个字节,通过位切换将这两个字节转换为short int,然后将其分配到Mat中。

这应该有用,但看起来很乏味,有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以将整个文件读入一个short的数组中。类似的东西:

#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 ++,因此您可以在读取之前确定文件大小并动态创建缓冲区。你仍然需要单独转换小/大端。

答案 1 :(得分:1)

根据TonyWilk的提示,我提出了以下建议:

#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;
}