Это очень плохой дизайн библиотеки. Однако ...
Как написать стандартную ошибку. Если outputing к 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
вместо a std::filebuf
; вы можете, по сути, создать собственный streambuf, , чтобы забрать звонки на sync
(который обычно вызывается после каждого <<
на std::cerr
). Если библиотека использует один из других методов, Единственное, что я могу придумать, это периодически читать файл, чтобы увидеть , если что-либо было добавлено. (Я хотел бы использовать read()
в Unix, ReadFile()
в Windows, для этого, для того, чтобы быть уверенными в том, способно отличить чтения нулевых байт, ничего не было написано после последнего чтения, и состояния ошибки из-за. FILE*
и функции iostream лечения чтения нулевых байтов в конец файла, а не читать дальше.)
Обратите внимание, что это очень легко получить затор при записи и чтения из тех же труб в том же потоке. 'Read' должен быть в цикле в другом потоке (или другом процессе), чтобы это было надежным. –
И, конечно же, это чистый Unix. Я не думаю, что он может быть использован под Windows (но, может быть ... Windows предоставляет большую часть интерфейса Unix). –
Я просто использую linux ... он может работать тогда ... – Stefano