2009-11-12 44 views
2

我一直認爲在調試器中運行一個MSVC++應用輸出窗口被映射到標準輸出流中的一個。但是當我在Windows MFC應用程序中運行此代碼時,什麼都看不到:如何使用STL IO將文本導入Visual Studio輸出窗口?

std::cerr << "cerr"<<std::endl; 
std::cout << "cout"<<std::endl; 
std::clog << "clog"<<std::endl; 

這是Windows事物還是VC++的東西?像TRACE和OutputDebugString這樣的函數/宏是如何寫入這個窗口的,我不應該在不使用它們的情況下這樣做?

回答

3

有映射到Visual Studio輸出窗口沒有標準樣式流。完成此操作的函數是OutputDebugString()。

你可以得到這樣的事情最接近的事就是創建一個行爲像一個ostream自己的包裝類,並調用下面OutputDebugStream。

+0

不OutputDebugStream,顧名思義,只有功能時_DEBUG定義?如果是這樣,那麼調試release-mode-with-debug-info .exes並沒有多大用處......對於這個問題,TRACE也不是。 –

+0

OutputDebugString是一個Windows API函數,可在調試版本和發佈版本中使用。通常像TRACE這樣的宏只是調試,所以如果你想繼續在發佈版本中編寫消息,你需要顯式調用OutputDebugString。 –

+0

酷,感謝澄清 –

0

可以使用RTP Macro

std:string myString = "SOMETHING"; 
_RPT1(_CRT_WARN, "%s\n", myString.c_str()); 

OutputDebugString

std:string myString = "SOMETHING"; 
OutputDebugString(savedStatementText.c_str()); 
0

這是流友好的方式,我已經在網上發現:

class debug_stream : public std::ostringstream 
{ 
public: 
    template<typename T> 
    friend debug_stream& operator<<(debug_stream& os, T&& s); 
}; 

template<typename T> 
debug_stream& operator<<(debug_stream& os, T&& s) 
{ 
    (ostringstream&amp;)os << s; 
    PrintToDebug(os.str()); 
    os.str(""); 
    return os; 
} 

class dbgview_buffer : public std::stringbuf 
{ 
public: 
    ~dbgview_buffer() 
    { 
     sync(); // can be avoided 
    } 

    int sync() 
    { 
     OutputDebugString(str().c_str()); 
     str(""); 
     return 0; 
    } 
}; 

使用它是這樣的:

dbgview_buffer buf; 
ostream dbgview(&buf); 
dbgview << "test" << endl; 
相關問題