Это очень плохой дизайн библиотеки. Однако ...
Как записать в стандартную ошибку. Если это вывод на std::cerr
,
тогда вы можете изменить streambuf
, используемый std::cerr
, что-то вроде:
std::filebuf logStream;
if ( ~logStream.open( "logfile.txt" ) )
// Error handling...
std::streambuf* originalCErrStream = std::cerr.rdbuf();
std::cerr.rdbuf( &logStream );
// Processing here, with calls to library
std::cerr.rdbuf( originalCErrStream ); // Using RAII would be better.
Только не забудьте восстановить первоначальный streambuf; оставив std::cerr
указание на filebuf
, который был разрушен, не хорошая идея.
Если они используют FILE*
, есть функция freopen
в C (и
включение в C ++), что вы можете использовать.
Если они используют вывод системного уровня (write
под Unix, WriteFile
под Windows), тогда вам придется использовать некоторый код системного уровня
изменить выход. (open
в новом файле, close
в fd
STDERR_FILENO
и dup2
для установки STDERR_FILENO
для использования недавно
открыл файл под Unix. Я не уверен, что это возможно под
Windows - может быть что-то с ReOpenFile
или какой-то комбинацией
CloseHandle
, а затем CreateFile
.)
EDIT:
Я только что заметил, что вы действительно хотите выводить в окно Qt. это
означает, что вам, вероятно, нужна строка, а не файл. Если
библиотека использует std::cerr
, вы можете использовать std::stringbuf
вместо
а std::filebuf
; на самом деле вы можете захотеть создать свой собственный потоковый буфер,
принимать звонки на номер sync
(который обычно вызывается после каждого
<<
на std::cerr
). Если библиотека использует один из других методов,
Единственное, о чем я могу думать, это периодически читать файл, чтобы увидеть
если что-нибудь было добавлено. (Я бы использовал read()
в Unix, ReadFile()
в Windows для этого, чтобы быть в состоянии отличить
чтение нулевых байтов, поскольку ничего не было записано с момента последнего
прочитайте, и состояние ошибки. FILE*
и функции iostream обрабатывают
читать ноль байтов как конец файла и не будет читать дальше.)