Это очень плохой дизайн библиотеки. Тем не мение...
Как пишет стандартная ошибка. Если он выводится на 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
.)
РЕДАКТИРОВАТЬ:
Я только что заметил, что вы действительно хотите вывести в окно Qt. Это означает, что вам, вероятно, нужна строка, а не файл. Если библиотека использует std::cerr
, вы можете использовать std::stringbuf
вместо std::filebuf
; на самом деле вы можете захотеть создать свой собственный streambuf, чтобы получать вызовы на sync
(который обычно будет вызываться после каждого <<
на std::cerr
). Если библиотека использует один из других методов, единственное, что я могу придумать, это периодически читать файл, чтобы посмотреть, не было ли что-то добавлено. (Я бы использовал для этого read()
в Unix, ReadFile()
в Windows, чтобы быть уверенным в возможности отличить чтение нулевых байтов из-за того, что с момента последнего чтения ничего не было записано, и из-за состояния ошибки. FILE*
и функции iostream рассматривать чтение нулевых байтов как конец файла и не читать дальше.)
person
James Kanze
schedule
08.02.2012