二进制.dat文件如何经C++并在matlab中处理

在GNURadio中使用file sink 保存的数据(全部是.dat文件),要想通过matlab来处理,中间必须经过相应的预处理,否则无法直接应用。应为matlab读取的时候是以字节为最小单位读取的char类型,而实际存储的float或者complex,float占据了四字节,complex占据了16字节,两个float,实部在前,虚部在后。这样的话直接利用matlab读取.mat数据无法得到想要的。

我的做法是:

将保存的.dat文件利用C++读取,并将数据保存到.txt文件中,然后在matlab下利用file->Import data读取,此时保存早matlab工作空间的数据还是cell类型,是字符串,然后经过 str2num(char(cell))进行类型转换得到数据,此时就可以在matlab下面进相关处理。


1,C++读取.dat文件

比如我保存的文件add_cp_out.dat,保存到add_cp_out.txt中。

中心代码如下:

	fstream file("add_cp_out.dat",ios_base::in|ios_base::out|ios_base::app|ios::binary);
	ofstream examplefileC ("add_cp_out.txt");
	file.seekg(0,ios_base::beg);
	int i=0;
	for(;(!file.eof())&(i<19200);i++)
	{
		complex temp;
		file.read((char *)(&temp),sizeof(temp));
		examplefileC<

利用i只是为了控制读取我所需要的数据量。

2,matlab导入txt文件

file->Import Data选项,,在对话框中选中想要导入的文件add_cp_out.txt,界面如下图:

二进制.dat文件如何经C++并在matlab中处理_第1张图片

然后next->finish即可;在matlab命令窗口输入whos将会得到:

>> whos
  Name                Size              Bytes  Class    Attributes

  add_cp_out      19200x1             2806126  cell        


可以看出类型是cell,是无法直接处理的,接下来只要运行:

>> str2num(char(add_cp_out));


就可以得到你需要的数据;

这样的方法可以处理任何地方得到的二进制.dat文件。

说明:

转载请说明出处;

以上仅仅是个人的做法,可能很麻烦,如果有朋友有更好的方法,请彼此交流。


修正:

         感谢网友   90天改一次 提醒,OCTAVE有与GNURadio的接口函数,可以直接读取file_sink模块保存的二进制数据,函数分别有

  • read_complex_binary(): gr.sizeof_gr_complex
  • read_float_binary(): gr.sizeof_float
  • read_int_binary(): gr.sizeof_int
  • read_short_binary(): gr.sizeof_short
  • read_char_binary(): gr.sizeof_char
参考: http://gnuradio.org/redmine/projects/gnuradio/wiki/Octave


你可能感兴趣的:(其他)