Реализация указателя FILE в c ++

0

Я использую библиотеку C в моем проекте C++. Для ведения журнала библиотека C требует, чтобы я определил указатель FILE для получения журналов, т.е.:

extern "C"
{
    FILE *pFileStdErr = stderr;
}

Это приведет к появлению журналов в окне консоли.

Однако я действительно хочу, чтобы захватить журналы из библиотеки C в моем методе класса C++, т.е.

extern "C"
{
    FILE *pFileStdErr = ???;
}

void CMyClass::Log (std::string error)
{
    m_myLogger.LogError(error);
}

Итак, как мне "склеить" это вместе?

  • 1
    Хорошо, я признаю это. Я прочитал это пару раз и все еще пытаюсь понять, что вы спрашиваете. Вы хотите, чтобы что-то магически записанное в pFileStdErr проходило через ваш CMyClass::Log ??
  • 0
    Если вы хотите, чтобы ваши журналы C ++ переходили в pFileStdErr , вам нужно изменить любой класс, к m_myLogger принадлежит m_myLogger . Если вы хотите, чтобы ваши журналы C переходили в ваш класс C ++, вам не повезло.
Показать ещё 2 комментария
Теги:

2 ответа

1

В GNU есть нестандартное расширение: fopencookie(). При этом вы можете определить поведение FILE самостоятельно.

Даже если вы не находитесь в GNU, ваша среда может обеспечить что-то вроде этого.

Но имейте в виду, что вы теряете переносимость, если вы это сделаете.

0

Вы можете создать канал с функцией pipe (_pipe on windows), а затем использовать fdopen для возвращаемых дескрипторов, чтобы получить указатель FILE *. Затем вы можете установить конец записи в качестве указателя FILE * для своей библиотеки и прочитать из прочитанного конца канала в своем классе.

  • 1
    Если функция C когда-либо попытается записать журналы объемом более одного конвейерного буфера, которые могут занимать всего 4 Кбайт, это приведет к взаимоблокировке. Вам нужно читать в отдельном потоке и буферизовать неограниченное количество данных.
  • 0
    И если вы идете по отдельному маршруту потока, вам нужно быть предельно осторожным при разработке синхронизации с основным потоком или быть готовым к работе с частичными и не по порядку сообщениями журнала.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню