C ++纯粹主义者现在可能想要把目光移开。你会讨厌这个。
我已经获得了一个开源的Windows控制台应用程序,我正在与我自己的预先存在的,非常古老的,非常大的Windows应用程序合并。我的旧程序以纯C开始,虽然最近已被调整,因此它可以编译为C ++。我的程序大量使用my_printf()函数将文本打印到窗口。
旧的控制台应用程序通过流程执行打印C ++样式(之前我从未使用过这种类型的打印机制)。
将控制台应用程序转换为在我的系统下工作时,我可以手动编辑所有打印的行,以便他们使用my_printf()代替。但在我开始之前,我认为我只是检查StackOverflow,看看我是否错过了一个技巧。例如,我可以想象以某种方式让C ++打印通过流完成,然后以某种方式将最终文本舀到某处,然后用结果调用my_printf()。可能有可能吗?
编辑:请注意我对C ++的了解非常有限,为了理解您的答案,我可能需要查看一些内容,所以请使用有助于此的语言。
答案 0 :(得分:7)
确实有一个微不足道的伎俩。但是C ++的混合体会讨厌C ++有一个纯粹的解决方案;)
std::ostream
负责格式化,但不打印自身。这是由std::streambuf
处理的。 std::cout
将std::ostream
格式化程序与写入stdout的std::streambuf
派生对象组合在一起。
但是,您可以使用streambuf
更改ostream
支持ostream::rdbuf(newbuf)
。由于std::cout
只是另一个ostream
,您也可以替换其streambuf
。在这种情况下,您只需要提供一个streambuf
派生类,它将已经格式化的输出写入my_printf()
。这应该是微不足道的。
答案 1 :(得分:4)
您可能会发现字符串流非常有用。例如:
std::ostringstream os;
os << "Print " << whatever << data;
my_printf( "%s", os.str().c_str() );
如果您喜欢冒险,可以编写自己的streambuf,而不是在下面使用my_printf,并将其注入当前在输出语句中使用的流对象(例如std :: cout)。请注意,后一种方法可能并不简单,但它会导致现有代码库几乎没有变化。
答案 2 :(得分:0)
子类std::ostream
并让operator <<
调用my_print_f()
。您可以在流中使用内部stringstream
来检索operator <<
参数的字符串表示形式。
然后你只需要查找和替换,用你的流类的实例替换cout
(或你在控制台应用程序中引导输出的任何流)。
答案 3 :(得分:0)
这些方面的内容可能会有所帮助:
http://www.codeproject.com/KB/debug/debugout.aspx
它的肉应该是显而易见的,所以你可以通过你自己的系统打印,或者你有什么。从理论上讲,您只需要搜索std::cout
的引用,并用对自己对象的引用替换它们。
答案 4 :(得分:-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;
}