最近的一个项目要处理大量存盘的二进制数据,之前考虑用MATLAB处理,实际运行发现读写速度太慢,几个
GB的数据要等很久,就考虑将这部分耗时且低效的工作用C完成,这就涉及到MATLAB和C的混合编程。C函数其实只有一个参数,即二进制文件存放路径(例如E:\data.dat),MATLAB程序只需将该路径传递给C即可,所以该参数是一个字符串。
用过C都知道,C中\代表转义字符,因此路径实际上要写成E:\data.dat,而MATLAB则是E:\data.dat,就在为此事而犯愁,怎么将一个\转换成\个时,在网上得到答案,C中的\实际上是给编译器写的,让它明白是\,而不是转义字符,当C完成编译后,传递给函数的字符串就不需要再转换了,因此这个小问题算是解决了。
按此,编写了相关的C代码如下:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
FILE *fp;
unsigned char *file_path;
file_path= mxGetPr(prhs[0]);
if((fp=fopen(file_path,"rb"))==NULL)
{
printf("Can't open the file specified by MATLAB!\n");
printf("%c,%c\n",file_path[0],file_path[3]);
return;
}
上面的代码,如果输入字符串为E:\data.dat,file_path[0],file_path[3]第一个输出为E,第二个没有输出;中间来回折腾多次,始终不对;
重新阅读MATLAB help文档,在mxcreatecharmatrixfromstr.c实例文件中发现了,传递字符串不能这样,应该改用mxArrayToString()函数,具体用法如下:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
FILE *fp;
unsigned char *file_path;
file_path= mxArrayToString(prhs[0]);
if((fp=fopen(file_path,"rb"))==NULL)
{
printf("Can't open the file specified by MATLAB!\n");
return;
}
即能正确打开文件。
另外,MATLAB的m文件转换成exe文件,使用mcc -e filename.m语句,生成的exe运行时就不会产生黑屏现象。
PS:环境为MATLAB 2009b和Microsoft Visual C++ 2005 SP1