当MATLAB桌面打开时,MathWorks当前不允许您使用mex文件中的cout,因为它们已重定向stdout.他们目前的解决方法是提供一个函数mexPrintf,它们要求您使用它.在谷歌搜索了一下之后,我认为可以扩展std :: stringbuf类来完成我需要的工作.这是我到目前为止所拥有的.这是否足够强大,还是有其他方法需要重载或更好的方法来做到这一点?(寻找一般UNIX环境中的可移植性以及如果此代码未与mex可执行文件链接,则能够正常使用std :: cout)
class mstream : public stringbuf { public: virtual streamsize xsputn(const char *s, std::streamsize n) { mexPrintf("*s",s,n); return basic_streambuf>::xsputn(s,n); } }; mstream mout; outbuf = cout.rdbuf(mout.rdbuf());
Shane Powell.. 9
你真的不想重载std :: stringbuf,你想重载std :: streambuf或std :: basic_streambuf(如果你想支持多种字符类型),你也需要覆盖溢出方法.
但我也认为您需要重新考虑解决问题的方法.
cout只是一个ostream,所以如果所有类/函数都采用ostream,那么你可以传入你喜欢的任何东西.例如cout,ofstream等
如果这太难了,那么我会创建我自己的cout版本,可能称为mycout,可以在编译器时间或运行时间定义(取决于你想要做什么).
一个简单的解决方案可能是
#include#include class mystream : public std::streambuf { public: mystream() {} protected: virtual int_type overflow(int_type c) { if(c != EOF) { char z = c; mexPrintf("%c",c); return EOF; } return c; } virtual std::streamsize xsputn(const char* s, std::streamsize num) { mexPrintf("*s",s,n); return num; } }; class myostream : public std::ostream { protected: mystream buf; public: myostream() : std::ostream(&buf) {} }; myostream mycout;
而cout版本可能只是:
typedef std::cout mycout;
运行时版本需要更多工作,但很容易实现.
你真的不想重载std :: stringbuf,你想重载std :: streambuf或std :: basic_streambuf(如果你想支持多种字符类型),你也需要覆盖溢出方法.
但我也认为您需要重新考虑解决问题的方法.
cout只是一个ostream,所以如果所有类/函数都采用ostream,那么你可以传入你喜欢的任何东西.例如cout,ofstream等
如果这太难了,那么我会创建我自己的cout版本,可能称为mycout,可以在编译器时间或运行时间定义(取决于你想要做什么).
一个简单的解决方案可能是
#include#include class mystream : public std::streambuf { public: mystream() {} protected: virtual int_type overflow(int_type c) { if(c != EOF) { char z = c; mexPrintf("%c",c); return EOF; } return c; } virtual std::streamsize xsputn(const char* s, std::streamsize num) { mexPrintf("*s",s,n); return num; } }; class myostream : public std::ostream { protected: mystream buf; public: myostream() : std::ostream(&buf) {} }; myostream mycout;
而cout版本可能只是:
typedef std::cout mycout;
运行时版本需要更多工作,但很容易实现.
谢恩,非常感谢你的帮助.这是我最后的工作实施.
class mstream : public std::streambuf { public: protected: virtual std::streamsize xsputn(const char *s, std::streamsize n); virtual int overflow(int c = EOF); };
...
std::streamsize mstream::xsputn(const char *s, std::streamsize n) { mexPrintf("%.*s",n,s); return n; } int mstream::overflow(int c) { if (c != EOF) { mexPrintf("%.1s",&c); } return 1; }
...
// Replace the std stream with the 'matlab' stream // Put this in the beginning of the mex function mstream mout; std::streambuf *outbuf = std::cout.rdbuf(&mout);
...
// Restore the std stream buffer std::cout.rdbuf(outbuf);