`
chenqi210
  • 浏览: 78993 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多输出带前缀输出流

    博客分类:
  • c++
 
阅读更多
http://stackoverflow.com/questions/2212776/overload-handling-of-stdendl 写道
#include <iostream>
#include <sstream>

class MyStream: public std::ostream
{
// Write a stream buffer that prefixes each line with Plop
class MyStreamBuf: public std::stringbuf
{
std::ostream& output;
public:
MyStreamBuf(std::ostream& str)
:output(str)
{}

// When we sync the stream with the output.
// 1) Output Plop then the buffer
// 2) Reset the buffer
// 3) flush the actual output stream we are using.
virtual int sync ( )
{
output << "[blah]" << str();
str("");
output.flush();
return 0;
}
};

// My Stream just uses a version of my special buffer
MyStreamBuf buffer;
public:
MyStream(std::ostream& str)
:std::ostream(&buffer)
,buffer(str)
{
}
};


int main()
{
MyStream myStream(std::cout);
myStream << 1 << 2 << 3 << std::endl << 5 << 6 << std::endl << 7 << 8 << std::endl;
}

> ./a.out
[blah]123
[blah]56
[blah]78
>
 

略微修改后:

class test2_stream : public ostream
{
	class test2_streambuf : public stringbuf
	{
		public:
			test2_streambuf(test2_stream &parent)
				:m_parent(parent)
			{}

			virtual int sync()
			{
				string t = DateTime::now().toString();
				string s = str();
				for(vector<ostream*>::iterator it = m_parent.m_outs.begin();
						it != m_parent.m_outs.end();
						++it) {
					(**it) << '[' << t << "]: " << s;
					(**it).flush();
				}
				seekoff(0, ios::beg);
				return 0;
			}
		private:
			test2_stream &m_parent;
	};

	public:
		test2_stream()
			:ostream(&m_buf),
			m_buf(*this)
		{}
		test2_stream& attach(ostream& os)
		{
			m_outs.push_back(&os);
			return *this;
		}
		test2_stream& detach(ostream& os)
		{
			m_outs.erase(std::remove(m_outs.begin(), m_outs.end(), &os), m_outs.end());
			return *this;
		}
	private:
		vector<ostream*> m_outs;
		test2_streambuf m_buf;
};
 

 

 

 

0
5
分享到:
评论

相关推荐

    c++中输入输出流的格式控制符

    ### C++中输入输出流的格式控制符 在C++编程语言中,输入输出流(I/O Stream)是处理数据输入输出的重要工具。为了更好地控制数据的格式化输出,C++提供了多种格式控制符,这些控制符可以帮助程序员精确地设置输出...

    OFDM加循环前缀的原因

    OFDM通过将高速数据流分解成多个低速子载波来传输,每个子载波上承载的数据速率较低,从而提高了系统的抗干扰能力和频谱效率。 #### 二、循环前缀的作用与必要性 在OFDM系统中加入循环前缀(Cyclic Prefix,CP),...

    C 标准输入输出流的常用操纵符

    ### C++标准输入输出流的常用操纵符 在C++编程语言中,标准输入输出流是程序员们频繁使用的工具之一。对于那些希望更好地控制输入输出流格式的人来说,掌握各种流操纵符是至关重要的。本文将详细介绍C++标准输入...

    输出单个字符

    `putchar`函数是C++标准库中的一个函数,用于向标准输出流(通常是屏幕)输出一个字符。它的原型定义如下: ```c++ int putchar(int character); ``` 其中`character`是要输出的字符。该函数接受一个整型参数,这...

    ofdm.rar_OFDM多用户_OFDM多用户检测_ofdm仿真_多用户OFDM_多输入多输出

    本资源是关于OFDM(正交频分复用)系统中多用户检测的MATLAB仿真程序,主要探讨了在多输入多输出(MIMO)环境下的OFDM通信技术。这一领域的研究对于现代无线通信系统至关重要,因为它极大地提高了频谱效率和通信系统...

    Hadoop MapReduce多输出详细介绍

    MultipleOutputFormat类的使用涉及到创建多个命名的输出流,这些流可以基于输出键值对或者任意字符串命名。对于每个输出流,开发者可以自定义输出格式,比如文件名前缀,分区编号等。通过实现MultipleOutputs类,...

    C++流的介绍

    在C++中,流可以分为输入流(input stream)和输出流(output stream)。输入流用于从外部源(如键盘、文件)获取数据,而输出流则负责将数据发送到目的地(如显示器、文件)。 C++的I/O库包含了多个类,它们构成了...

    Java中标准输入输出.pdf

    PrintStream是过滤输出流类FilterOutputStream的一个子类,其中定义了向屏幕输出不同类型数据的方法print()和println()。 * println()方法:println([类型变量或对象]);此方法的作用是向屏幕输出其参数指定的变量...

    IO流的总结

    例如,对于硬盘上的文件操作,可以选择带有`File`前缀的流对象。 4. **确定是否需要额外功能**: - **高效处理**:使用缓冲流如`BufferedInputStream`或`BufferedReader`。 - **编码转换**:使用`...

    移动通信实验-正交频分复用-多输入多输出-内含源码和说明书.zip

    OFDM是一种数字调制技术,它将高速的数据流分割成多个较低速率的数据流,然后在多个互相正交的子载波上进行传输。这种技术有效对抗了多径衰落,提高了频谱效率。OFDM的核心在于子载波间的正交性,使得每个子载波上的...

    InfixExp 前缀表达式

    5. **输出前缀表达式**:最后,词法分析器将按照前缀表达式的形式输出计算后的表达式,即运算符位于其操作数之前。 在实际应用中,"InfixExp"这样的工具可以帮助理解和学习编译原理,也可以作为开发自定义解析器或...

    C++流的概念.ppt

    C++流分为输入流和输出流,前者用于从外部源获取数据,后者则用于向目标发送数据。 在C++中,流的操作主要是通过重载的运算符`和`&gt;&gt;`来实现的。`被称为插入运算符,常用于输出操作,向流中添加数据;而`&gt;&gt;`被称为...

    面向数据流的多层Count-Min概要数据结构.pdf

    同时,由于计数器的递增是基于多个哈希函数的输出结果,而不是单一的哈希输出,这为HCM提供了更好的估计精度。而在多层数据域中应用HCM结构,意味着它不仅可以处理简单的一维数据流,还能处理具有复杂层次关系的多维...

    VC++哈夫曼树的输出

    哈夫曼编码是一种可变长度的前缀编码,它通过为出现频率较高的字符分配较短的编码,使得常用字符在传输或存储时占用更少的空间,从而提高效率。在VC++环境中实现哈夫曼树的输出,我们需要理解以下几个关键知识点: ...

    基于Python的ArcGIS批量地图输出方法.zip

    在GIS(地理信息系统)领域,批量处理地图输出是一项常见的任务,尤其当需要处理大量地图或者进行自动化工作流时。Python结合Esri的ArcGIS软件,提供了强大的自动化工具,可以高效地实现这一目标。本篇文章将深入...

    Java利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹

    Java语言提供了多种方式来实现文件夹内所有文件拷贝到另一个文件夹,本文将介绍使用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹的方法。 一、基本目标 使用Java完成以下操作:把一个文件夹内的所有文件...

    c++程序计算矩形面积

    `引入了`std`命名空间,这样可以直接使用`cout`、`cin`等标准输入输出流对象,而无需带上`std::`前缀。 5. **数据类型转换**: 在输出函数中,使用`'\t'`和`endl`来插入制表符和换行符,使输出格式整洁。`'\t'`是...

    gif图片文件编解码

    编码不存在,前缀对应的字符串的第一个字符作为后缀(这时当前字符串肯定不存在,字典中下一个可用编码肯定等于刚取出的编码),字符串添加到字典中,编码作为前缀,前缀对应的字符串添加到输出流,继续取。...

    C++输出毕业快乐.docx

    在C++中,`cout`是`ostream`类的一个对象,用于标准输出流(通常是屏幕)。通过使用`运算符,我们可以将数据输出到屏幕上。在本例中,使用`cout`来输出字符串“毕业快乐”。 **示例代码:** ```cpp cout 毕业快乐" ...

Global site tag (gtag.js) - Google Analytics