Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6460
Последний выпуск: 19.06.2015

Стандартный поток вывода + GUI

437
23 февраля 2013 года
Meander
487 / / 04.09.2011
В GUI приложении использую стороннюю библиотеку исходного кода.
В ходе выполнения, вызываемая мной функция может выводить сообщения этим способом:
int printf(...);
Могу ли я перехватывать этот вывод для перенаправления в свое окно?
Как обычно поступают в таком случае?
437
23 февраля 2013 года
Meander
487 / / 04.09.2011
Да, уж, нашел
правда туда бы пару строк добавить не помешало:

Код:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // Создаем буфер-приемник стандартного потока вывода
  char buf[16384]={0};
  int fdpipe[2];
  // Создаем пайп
  _pipe( fdpipe, sizeof(buf), O_BINARY );
  // Запоминаем исходный поток вывода
  int old = dup(_fileno(stdout));
  // Подменяем потоковый буфер нашим
  dup2(fdpipe[1],_fileno(stdout));

  printf ("Некий текст");////////////////////////

  // Пишем содержимое потока в буфер
  int r = read(fdpipe[0],buf,sizeof(buf));
  //Добавляем признак конца строки
  buf[r]=0;
  // Восстанавливаем исходный поток вывода
  dup2(old,_fileno(stdout));

  Memo1->Lines->SetText(buf);////////////////////////
}
437
24 февраля 2013 года
Meander
487 / / 04.09.2011
Вот в виде класса сделал:
Код:
//---------------------------------------------------------------------------
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
//---------------------------------------------------------------------------
class CatchOut {
  private:
    char  buffer[16384];//    |1024|2048|4096|8192|16384|32768|
     int  fdpipe[2],
          old;
  public:
          CatchOut(void){};
    void  Begin(void);
    void  End(void);
    char *GetText(void);
};
//---------------------------------------------------------------------------
void  CatchOut::Begin(void){
  _pipe(fdpipe,sizeof(buffer),O_BINARY);// Создаем пайп
   old = dup(_fileno(stdout));// Запоминаем исходный поток вывода
   dup2(fdpipe[1],_fileno(stdout));// Подменяем потоковый буфер нашим
}

void  CatchOut::End(void){
  int r = read(fdpipe[0],buffer,sizeof(buffer));// Пишем содержимое потока в буфер
  buffer[r] = 0;
  dup2(old,_fileno(stdout));// Восстанавливаем исходный поток вывода
}

char*  CatchOut::GetText(void){
  return buffer;
}
//---------------------------------------------------------------------------
#include <iostream>
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  CatchOut co;
  co.Begin();
    printf ("floats: %4.2f %+.2e %E \n", 3.1416, 3.1416, 3.1416);
    std::cout << "GGGGGGGGGGGGGG" << std::endl;
  co.End();

  Memo1->Lines->SetText(co.GetText());
}
//---------------------------------------------------------------------------

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог