我正在使用matlab代码来读取二进制数据:
**nfft = 256;
navg = 1024;
nsamps = navg * nfft;
f_s = 8e6;
nblocks = floor(10 / (nsamps / f_s));
for i = 1:nblocks
nstart = 1 + (i - 1) * nsamps;
fid = fopen('data.dat'); % binary data and 320 MB
fseek(fid,4 * nstart,'bof');
y = fread(fid,[2,nsamps],'short');
x = complex(y(1,:),y(2,:));
end**
它会给我复杂的数据,长度可达8e6。
我正在尝试编写C ++来执行与matab相同的功能,但我无法获取所有数据或者它们不是同一个原始数据。
任何人都可以帮助理想吗?
这是我正在处理的C ++代码。
非常感谢你。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <complex>
#include <vector>
#include <stdlib.h>
struct myfunc{
char* name;
};
int main() {
FILE* r = fopen("data.bin", "rb");
fread( w, sizeof(int), 30, r);
fread(&c, sizeof(myfunc),1,r);
for(int i=0; i < 30; i++){
cout<< i << ". " << w[i] << endl;
}
return 0;
}
答案 0 :(得分:0)
基于评论
c我从struct myfunc调用,w是向量。所以它们将是:int w [40]; myfunc c;
fread(&c, sizeof(myfunc),1,r);
将从文件流r
中读取一个指针的数据到c
。这不会特别有用,因为在写入文件时指向的任何地址myfunc.name
在读回文件时几乎肯定无效。
解决方案:在写入文件时序列化myfunc.name
并在读取时反序列化它。信息不足是建议如何最好地做到这一点。我会存储字符串Pascal样式并加上myfunc.name
的长度,以便更容易阅读它:
int len = strlen(myfunc.name);
fwrite(&len, sizeof(len), 1, outfile); // write length
fwrite(myfunc.name, len, 1, outfile); // write string
并阅读
int len;
fread(&len, sizeof(len), 1, infile); // read length
myfunc.name = new char[len+1]; // size string with space for terminator
fwrite(myfunc.name, len, 1, infile); // read string
myfunc.name[len] = '\0'; // terminate string
请注意,上面的代码完全忽略了endian和错误处理。