matlab的mexFunction中使用std::cout(部分转载)

本文介绍了一种在C++与MATLAB混合编程中,将C++标准输出std::cout重定向到MATLAB mexPrintf的方法,通过自定义streambuf类实现输出的无缝切换,便于代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large]在matlab、C++混合编程的时候,可能会用到之前的代码。代码中会有许多的输出(使用std::cout);
如果将这些std::cout重新用mexPrintf()写一遍,不仅费时费力,还造成原来的程序在别的地方无法编译的问题。

那么,有没有办法将std::cout重定向到mexPrintf呢?

原理没深究,直接[color=red]转载[/color]代码:[/size][url]http://stackoverflow.com/questions/243696/correctly-over-loading-a-stringbuf-to-replace-cout-in-a-matlab-mex-file[/url]
[color=blue][size=large]先定义一个自己的streambuf类:[/size][/color]

class mstream : public std::streambuf {
public:
protected:
virtual std::streamsize xsputn (const char *s, std::streamsize n) {
mexPrintf ("%.*s", n, s);
return n;
}
virtual int overflow (int c = EOF) {
if (c != EOF) {
mexPrintf ("%.1s", &c);
}
return 1;
}
};

[color=blue][size=large]mexFunction中这么用就可以了:[/size][/color]

void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
mstream mout;
std::streambuf *outbuf = std::cout.rdbuf (&mout);//重定向cout


std::cout << "haha" << std::endl;


std::cout.rdbuf (outbuf);//结束重定向

}
#include"HxxModel.h" #include<iostream> int main(int argc, char* argv[]) { float vec1[1000] = { 0 }; float vec2[1000] = { 0 }; float vec3[1000] = { 0 }; float vec4[1000] = { 0 }; float vec5[1000] = { 0 }; float vec6[1000] = { 0 }; float vec7[1000] = { 0 }; float vec8[1000] = { 0 }; /* if(OpenHuxxSerialDevice(0,"COM9",115200)) { std::cout << " read data " << std::endl; while(1){ if (ReadHuxxSerialChannelData(0,vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8 ,1000) >= 0) { std::cout << "***** vec1:" << vec1[0] << " | vec2: " << vec2[0]<<" | vec3: "<<vec3[0]<<" vec4:[0] "<<vec4[0] << std::endl; } else { std::cout << " getdatafailed " << std::endl; } _sleep(20); } } */ //*******************************************************************************************************************************************************// //if (OpenHuxxDevice(0)) { // std::cout << " open huxx succees " << std::endl; //printf("start \rn"); //unsigned char info[4096]; //ReadHuxxDevInfo(0,info); //printf(" result %s \r\n ", info); //printf("end\rn"); //unsigned long count=0; //if (StartHuxxReadThread(0)) { // std::cout << " open huxx succees run" << std::endl; //} //while (1) { // if (GetHuxxChannelData(0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, 1000)) { // std::cout << "***** vec1:" << vec1[0] << " | vec2: " << vec2[0] << " | vec3: " << vec3[0] << " vec4:[0] " << vec4[0] << std::endl; // } // else { // std::cout << " getdatafailed " << std::endl; // } // if (count == 50) { // SetHuxxRange(0, ); // } //_sleep(20); //} // } // CloseHuxxDevice(0); // std::cout << " close huxx succees " << std::endl; if (OpenHuxxDevice(0)) { std::cout << " open huxx succees " << std::endl; } if (StartHuxxReadThread(0)) { std::cout << " open huxx succees run" << std::endl; while (1) { if (GetHuxxChannelData(0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, 1000)) { //std::cout << "***** vec1:" << vec1[0] << " | vec2: " << vec2[0] << " | vec3: " << vec3[0] << " vec4:[0] " << vec4[0] << std::endl; } else { std::cout << " getdatafailed " << std::endl; } _sleep(1); } } CloseHuxxDevice(0); std::cout << " close huxx succees **** " << std::endl; return 0; } 转成matlab程序
最新发布
08-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值