2010-10-08 33 views
2

C++纯粹主义者可能想现在把目光移开。你会讨厌这个。转换为my_printf()

我一直在考虑,我有一个预先存在的,非常古老,非常大的窗户我自己的应用程序合并一个开源的Windows控制台应用程序。尽管最近我的旧程序已经调整过,所以它可以编译为C++,但我的旧程序起初只是纯C语言。我的程序广泛使用了将文本打印到窗口的my_printf()函数。

旧的控制台应用程序确实通过流其打印C++风格(我从来没有使用之前,这种类型的印刷机构)。

当转换控制台应用程序在我的系统下工作,我可以手动编辑都让他们使用my_printf()而不是做印刷的线条。但在开始之前,我想我只是用StackOverflow来检查我是否错过了一个技巧。例如,我可以想象通过流来完成C++打印,然后以某种方式捕获最终文本,然后调用my_printf()和结果。这可能吗?

编辑:请注意我对C++的知识是非常有限的,为了理解你的答案,我可能需要查看一些东西,所以请使用有助于此的语言。

+1

你能提供一些代码吗? – wheaties 2010-10-08 12:56:37

+0

@wheaties你想看什么? C++样式的打印还是my_printf()?或两者? – Mick 2010-10-08 12:58:00

回答

4

您可能会发现字符串流非常有用。例如:

std::ostringstream os; 
os << "Print " << whatever << data; 
my_printf("%s", os.str().c_str()); 

如果你喜欢冒险的感觉,你可以写自己的流缓冲而不是下使用my_printf,并注入到当前在输出语句中使用(如性病::法院)的流对象。要警告的是,后一种方法可能不是微不足道的,但它会导致现有代码库几乎没有变化。

+0

+1这似乎是解决使用这种固定API的最显而易见的解决方案。 – 2010-10-08 13:20:49

0

子类std::ostream并使operator <<调用my_print_f()。您可以在您的流中使用内部stringstream来检索operator <<参数的字符串表示形式。

然后,您只需要找到&替换,替换为cout(或将您的输出指向控制台应用程序的任何流)替换为您的流类的实例。

-1

超载全球operator<<可能就是会解决你的问题:

#include <iostream> 
#include <cstdio> 

static int 
my_printf (const char* s) 
{ 
    printf ("my_printf: %s\n", s); 
} 

namespace std { 
    std::ostream& operator<< (std::ostream& out, const char* s) 
    { 
     my_printf (s); 
     return out; 
    } 
} 

int 
main() 
{ 
    std::cout << "hello, world"; // => my_printf: hello, world 
    return 0; 
} 
+0

为什么有人downvote这个答案? – Mick 2010-10-08 13:20:58

+2

-1,这在很多层面上都是错误的。最令人沮丧的是,它会引入令人惊讶的命名空间依赖。普通的'operator <<'是**不是全局**。它是'std :: operator <<'。 – MSalters 2010-10-08 13:21:02

+0

@Mick可以赞成票它:-) – 2010-10-08 13:35:53

7

有的确是微不足道的伎俩。但C++杂质人员会讨厌C++具有纯粹解决方案的事实)

std::ostream负责格式化,但不是自行打印。这是由std::streambuf处理。 std::cout结合了std::ostream格式化器与写入stdout一个std::streambuf派生对象。

但是,您可以使用ostream::rdbuf(newbuf)更改支持ostreamstreambuf。由于std::cout只是另一个ostream,您可以替换它的streambuf。在这种情况下,你只需要拿出写入已经格式化输出到my_printf()一个streambuf派生类。这应该是相当微不足道的。

+0

这个解决方案的确可能比usta的答案中的示例代码更光滑,但其他答案对我来说更容易理解和实现。无论如何,从我+1。 – Mick 2010-10-08 15:37:29

0

东西沿着这些线路可能会有所帮助:

http://www.codeproject.com/KB/debug/debugout.aspx

应该是显而易见的,其中它的肉,所以你可以把它通过自己的系统,或者你有什么打印。理论上,您只需要搜索对std::cout的引用,并将它们替换为对您自己的对象的引用。