2010-10-08 32 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的引用,並將它們替換爲對您自己的對象的引用。