Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-07, 23:17   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
默认 正确重载stringbuf以替换MATLAB mex文件中的cout

当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()); 回答:
您并不是真的想重载std::stringbuf ,而是想重载std::streambuf或std::basic_streambuf (如果您想支持多种字符类型),那么您还需要重写overflow方法。

但我也认为您需要重新考虑问题的解决方案。

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; 提示版本可能只是:

typedef std::cout mycout; 运行时版本需要更多工作,但容易实现。
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:33


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.