2009-02-07 4 views
17

Для образовательных целей я хочу создать ostream и поток буфер сделать:Как создать собственный собственный поток/streambuf?

  1. починки блефускианских при выполнении < < MYVAR;
  2. магазин в DEQUE контейнере вместо использования зЬй: COUT или записи в файл
  3. журнала дополнительных данных, например, сколько раз я < <, сколько раз я .WRITE, количество байт I письменного и сколько раз я делаю флеш(). Но мне не нужна вся информация.

Я пробовал перегружать, но неудачно. Я попытался перегрузки записи, делая

ostream& write(const char* s, streamsize n) 

в моем классе basic_stringstream2 (я скопировал вставки basic_stringstream в мой файл CPP и изменить его), но код продолжал использовать basic_ostream. Я просмотрел код и, похоже, мне нужно перегрузить xsputn (который не упоминается на этой странице http://www.cplusplus.com/reference/iostream/ostream), но что еще мне нужно перегрузить? и как я могу построить свой класс (что ему нужно для наследования и т. д.)?

+1

Могли бы вы предоставить выписку из кода, который «держал используя basic_ostream»? –

ответ

1

Я не уверен, что то, что вы хотите сделать, возможно. Операторы << не являются виртуальными. Таким образом, вы можете определить yourstream &operator << (yourstream &strm, int i), чтобы делать то, что хотите, с преобразованием и подсчетом endian, и оно будет работать, когда ваш код вызывает его напрямую. Но если вы передадите объект yourstream в функцию, ожидающую ostream, в любое время, когда функция вызывает <<, она перейдет к исходной версии ostream вместо вашей.

Как я понял, объекты потоков были настроены так, что вы можете «легко» определить новый тип потока, который использует буфер буфера другого типа (например, дека символов), и вы можете очень легко добавить поддержку для вывода собственных классов через <<. Я не думаю, что вы намерены переопределить средний слой между ними.

И, в частности, вся точка интерфейса << должна обеспечивать хорошо отформатированный текстовый вывод, в то время как кажется, что вы действительно хотите двоичный выход. (В противном случае ссылка на «endian» не имеет смысла.) Даже если предположить, что есть какой-то способ сделать это, я не знаю, в лучшем случае это приведет к неловкому двоичному выходу. Например, рассмотрите перегрузку конечного пользователя для вывода точки в трехмерном пространстве. Версия конечного пользователя <<, вероятно, сделает что-то вроде << '(' << x << ", " << y << ", " << z << ')'. Это будет выглядеть красиво в текстовом потоке, но это много потерянных и совершенно бесполезных символов в бинарном потоке, что идеально подходит для использования << x << y << z. (И сколько звонков в << должны ли они считаться?)

6

Для A + C), я думаю, вы должны смотреть на грани, они изменяют, как объекты записываются как символы. Вы также можете хранить статистику о том, сколько раз вы передавали свои объекты. Выезд How to format my own objects when using STL streams? для примера.

Для B) Вам необходимо создать свой собственный streambuf и связать ваш поток с этим буфером (аргумент конструктора). См. Luc's links + Deriving new streambuf classes. Короче говоря вам нужно реализовать это для ostream (минимум):

  • переполнение (поместите один символ или флеш-буфер) (link)
  • xsputn (поместить массив символов в буфер) (link)
  • синхронизации (link)
+0

Большинство ссылок в этом теперь болтаются. – Omnifarious

Смежные вопросы