2013-03-28 41 views
2

我正在將C++代碼添加到iOS應用程序,並且我想使用UITextView作爲顯示正在經過std :: cout的方式。我不想修改C++代碼太多。如何將std :: cout重定向到UITextView?

到目前爲止,我已經定義了一個名爲stdcout的字符串流,在我感興趣的C++代碼捕獲輸出的範圍內,並且在C++代碼塊返回後更新了UITextView。這有點侵入性,因爲我需要做一些手動文本替換,而且容易出錯。

有沒有更好的方法來做到這一點?

+0

如果這一切都定位於一個文件,爲什麼不使用char *放置到輸出流中,並將其放入NSString中(使用'+ stringWithUTF8String:')。然後根據需要調用'setText:' – CodaFi 2013-03-28 08:51:29

+0

我真的不想跟蹤std :: cout的每個用法並修改它。 – alecail 2013-03-28 08:53:56

回答

3

你可以看看rdbuf()。

如果您關心性能/靈活性,您可以編寫自定義流緩衝區並實現溢出成員,以便「自動」「實時」更新。

這裏有一個簡單的例子中繼到一個字符串流:

#include <sstream> 
#include <iostream> 

int main() 
{ 
    std::ostringstream oss; 
    auto saved = std::cout.rdbuf(oss.rdbuf()); 

    std::cout << "hello world" << std::endl; 

    std::cout.rdbuf(saved); 
    return oss.str().length(); 
} 

這項計劃與退出碼「12」離開我的cygwin外殼:

./test.exe; echo $? 
12 
+0

我不熟悉流緩衝區。什麼是溢出成員? – alecail 2013-03-28 09:34:34

+0

流緩衝區IME工作的最佳描述在[DietmarKühl]的答案中(http://stackoverflow.com/search?tab=votes&q=user%3a1120273%20overflow):例如, http://stackoverflow.com/questions/12716990/encrypting-and-serializing-stl-string-and-other-containers/12717492#12717492,http://stackoverflow.com/questions/13943280/c-template-operator-編譯錯誤/ 13943353#13943353,(還[other](http://stackoverflow.com/search?tab=votes&q=user%3a1120273%20buffer)相關答案)。一定要考慮升壓IOStreams。 – sehe 2013-03-28 09:49:01