Обтекание ФАЙЛА * пользовательским std :: ostream - PullRequest
6 голосов
/ 11 ноября 2010

У меня есть функция, которая работает с std::ostream. Мне нужно поддерживать использование дескриптора файла C (FILE*). Должен ли я создавать мой собственный подкласс из std::ostream, который делегирует FILE*?

Ответы [ 2 ]

6 голосов
/ 21 февраля 2013

Как отмечает Бен Фойгт, вы хотите создать подкласс streambuf.На веб-сайте Университета Южной Калифорнии есть страницы с документацией , header и source для реализации GNU подкласса streambuf (stdiobuf) который оборачивает FILE*.Он имеет некоторые зависимости от библиотеки, частью которой он является (GroovX), но их следует легко удалить (я бы начал с удаления всех ссылок на GVX_TRACE).

Интересно, что он также обеспечивает минималистичныйподкласс (stdiostream) из std::iostream, несмотря на то, что сказал Бен Фойгт.Но в этом нет необходимости, поскольку метод rdbuf («буфер чтения» / установка буфера потока), который класс stdiostream использует для подключения класса stdiobuf к объекту потока, является открытымavailable.

Подробнее о подклассах streambuf вы можете узнать здесь (смотрите, в частности, внизу страницы, где обсуждаются виртуальные функции).Реализация, связанная выше, переопределяет sync, underflow (для поддержки ввода) и overflow (для поддержки вывода).

Дополнительные замечания о связанной реализации:

  • В методе init используются методы setg и setp для установки указателей длявходные и выходные последовательности.
  • Строка const int num = pptr()-pbase(); вычисляет количество очищаемых символов путем вычитания базового выходного указателя из текущего выходного указателя ("put"указатель ").
  • Переменная с именем om является параметром режима.
  • Переменная с именем fd является дескриптором файла.
6 голосов
/ 11 ноября 2010

Нет, ostream не предназначен для получения. Библиотека iostreams позволяет выполнять настройку путем предоставления указателя streambuf при создании ostream. streambuf имеет множество виртуальных функций, поэтому вы можете изменить его поведение.

Вам необходимо получить либо непосредственно из streambuf, либо из существующего подкласса filebuf. Вам, вероятно, нужно только предоставить функцию overflow, значения по умолчанию для всех остальных должны работать нормально.

...