这是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中。
这应该有用,但看起来很乏味,有更好的方法吗?
答案 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;
}