Extending C++ ostream
Extending C++ ostream
我正在尝试通过扩展std::streambuf
来了解有关C++ I/O流库工作原理的更多信息。 作为一个学习实验,我的目标是简单地创建一个自定义流,将所有输出定向到std::cerr
。 这似乎很简单:
#include <iostream>
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<char>(os)); // DOESN'T WORK
}
我想问题是xsputn
不处理单个字符插入。 (我猜sputc
不会在内部打电话给xsputn
? 但是,查看std::streambuf
中的虚拟受保护函数列表,我没有看到任何我应该覆盖的处理单个字符插入的函数。
那么,我该如何才能做到这一点呢?
单字符输出由 overflow
处理。以下是在xsputn
执行实际输出时如何在xsputn
方面实现overflow
:
int_type overflow(int_type c = traits_type::eof())
{
if (c == traits_type::eof())
return traits_type::eof();
else
{
char_type ch = traits_type::to_char_type(c);
return xsputn(&ch, 1) == 1 ? c : traits_type::eof();
}
}
相关文章:
- ostream过载时的缓冲区冲洗
- 需要从 istream 和 ostream 派生 iostream
- "ostream &os"有什么用?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++表达SFINAE和ostream操纵器
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 将 ostream 包装在类中并模板化<<运算符
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 为什么在返回 ostream 类时使用引用?
- 将标准输出重定向到ostream
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- ostream& operator<< (ostream& (*pf)(ostream&));
- 使用 ostream 变量删除代码重复