2013-03-28 3 views
2

Я добавляю код C++ в приложение iOS, и я хотел бы использовать UITextView в качестве способа отображения того, что происходит через std :: cout. Я не хочу слишком сильно модифицировать код C++.Как перенаправить std :: cout в UITextView?

До сих пор я определил поток строк с именем stdcout, в области кода C++, который мне интересен при записи вывода, и я обновляю UITextView после возвращения блока C++. Это немного навязчиво, поскольку мне нужно выполнить некоторую замену текста вручную, и это подвержено ошибкам.

Есть ли лучший способ сделать это?

+0

Если это все локализованы в одном файле, то почему бы не просто используйте char *, который вы помещаете в выходной поток, и поместите его в NSString (с '+ stringWithUTF8String:'). Затем вызовите 'setText:' по мере необходимости – CodaFi

+0

Я действительно не хочу отслеживать каждое использование std :: cout и изменять его. – alecail

ответ

3

Вы можете посмотреть на rdbuf().

Если вам небезразлична производительность/гибкость, вы можете написать собственный буфер потока и реализовать элементы переполнения, чтобы получить «автоматическое» «живое» обновление.

Вот простой пример ретрансляцию к stringstream:

#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(); 
} 

Эта программа выходит с ExitCode «12» на моей Cygwin оболочки:

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

Я не знаком с потоковыми буферами. Что такое элементы переполнения? – alecail

+0

Лучшее описание работы буферов потоков IME находится в ответах [Dietmar Kü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- compilation-error/13943353 # 13943353, (но также [прочее] (http://stackoverflow.com/search?tab=votes&q=user%3a1120273%20buffer) ответы). Не забудьте также рассмотреть Boost IOStreams. – sehe

Смежные вопросы