从C ++样式打印转换为my_printf()

时间:2010-10-08 12:53:21

标签: c++ c visual-studio-2008 windows-xp

C ++纯粹主义者现在可能想要把目光移开。你会讨厌这个。

我已经获得了一个开源的Windows控制台应用程序,我正在与我自己的预先存在的,非常古老的,非常大的Windows应用程序合并。我的旧程序以纯C开始,虽然最近已被调整,因此它可以编译为C ++。我的程序大量使用my_printf()函数将文本打印到窗口。

旧的控制台应用程序通过流程执行打印C ++样式(之前我从未使用过这种类型的打印机制)。

将控制台应用程序转换为在我的系统下工作时,我可以手动编辑所有打印的行,以便他们使用my_printf()代替。但在我开始之前,我认为我只是检查StackOverflow,看看我是否错过了一个技巧。例如,我可以想象以某种方式让C ++打印通过流完成,然后以某种方式将最终文本舀到某处,然后用结果调用my_printf()。可能有可能吗?

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

5 个答案:

答案 0 :(得分:7)

确实有一个微不足道的伎俩。但是C ++的混合体会讨厌C ++有一个纯粹的解决方案;)

std::ostream负责格式化,但不打印自身。这是由std::streambuf处理的。 std::coutstd::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;
}