Стандартный поток вывода + GUI
В ходе выполнения, вызываемая мной функция может выводить сообщения этим способом:
int printf(...);
Могу ли я перехватывать этот вывод для перенаправления в свое окно?
Как обычно поступают в таком случае?
Да, уж, нашел
правда туда бы пару строк добавить не помешало:
правда туда бы пару строк добавить не помешало:
Код:
#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);////////////////////////
}
#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);////////////////////////
}
Код:
//---------------------------------------------------------------------------
#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());
}
//---------------------------------------------------------------------------
#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());
}
//---------------------------------------------------------------------------