当前位置:  开发笔记 > 编程语言 > 正文

正确地重载了​​一个stringbuf来替换MATLAB mex文件中的cout

如何解决《正确地重载了​​一个stringbuf来替换MATLABmex文件中的cout》经验,为你挑选了2个好方法。

当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;

运行时版本需要更多工作,但很容易实现.



1> Shane Powell..:

你真的不想重载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;

运行时版本需要更多工作,但很容易实现.



2> user27315..:

谢恩,非常感谢你的帮助.这是我最后的工作实施.

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); 

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有