Я пытаюсь узнать больше о работе библиотеки потоков ввода-вывода C++, расширив std:: потокбаф
. В качестве обучающего эксперимента моя цель — просто создать собственный поток, который направляет весь вывод на std::cerr
. Это кажется достаточно простым:
#include
using namespace std;
class my_ostreambuf : public std::streambuf
{
public:
protected:
std::streamsize xsputn(const char * s, std::streamsize n)
{
std::cerr << "Redirecting to cerr: " << s << std::endl;
return n;
}
};
int main()
{
my_ostreambuf buf;
std::ostream os(&buf);
os << "TEST";
}
Кажется, это работает, так как печатает Redirecting to cerr: TEST
. Проблема в том, что он не работает, когда одиночный символ(в отличие от строки) вставляется в поток через std::ostream::sputc
]. Например:
int main()
{
my_ostreambuf buf;
std::ostream os(&buf);
os << "ABC"; // works
std::string s("TEST");
std::copy(s.begin(), s.end(), std::ostreambuf_iterator(os)); // DOESN'T WORK
}
Я думаю, проблема в том, что xsputn
не поддерживает вставку одиночных символов. (Наверное, sputc
не вызывает xsputn
внутри?) Но, просматривая список виртуальных защищенных функцийв std::streambuf
, я не вижу никакой функции, которую я должен переопределить, которая обрабатывает вставку одного символа.
Итак, как мне это сделать?