输出到stdout和带有cout、cerr、clog甚至用户定义的ostream的文件
Outputting to a stdout and a file with cout, cerr, clog, or even user defined ostreams
问题
我一直在寻找一种方法来实现将cout、cerr等输出到控制台和文件的方法,不幸的是,我对缓冲区的了解非常缺乏,所以详细解释一下一切都在做什么会很好。
我能做的最令人印象深刻的事情是:
//Includes not shown
std::ofstream file ("out.txt");
std::streambuf* fileSb = file.rdbuf();
cout.rdbuf(fileSb);
但即使我的知识有限,根据我对结构的研究,我也有一些想法:
main.cpp
#include <iostream>
#include <fstream>
#include "dualBuffer.h"
int main () {
std::ofstream file ("out.txt");
dualBuffer(cout, file);
std::cout << "Hellow world!" << std::endl; //This outputs to console and file
}
dualBuffer.h
#include <iostream>
class dualBuffer : public streambuf /*Maybe ostream as well ????*/ {
public:
dualBuffer (std::ostream & os1, std::ostream& os2)
: *os1b ( os1.rdbuf() )
, *os1b ( os2.rebuf() )
{ }
//Another constructor if streambuf* is passed instead
private:
std::streambuf *os1b, *os2b;
}
//May have typos or bugs
其中一个要求是它都建立在标准库之上,不依赖于外部或操作系统,另一个是我希望它在dualBuffer构造函数完成任务后,cout在程序的每个部分都具有相同的属性
您的需求改变了cout的正常行为,这会使代码变得混乱。为什么不使用另一个类来执行此操作呢。像这样:
#include <fstream>
#include <iostream>
class GeneralOStream
{
public:
GeneralOStream(std::ostream& stdStream, std::ostream& fileStream)
:_stdStream(stdStream)
, _fileStream(fileStream)
{
}
template<typename T>
friend GeneralOStream& operator << (GeneralOStream& stream, const T& t);
private:
std::ostream& _stdStream;
std::ostream& _fileStream;
};
template<typename T>
GeneralOStream& operator << (GeneralOStream& stream, const T& t)
{
stream._stdStream << t;
stream._fileStream << t;
return stream;
}
int main()
{
std::ofstream file("out.txt");
GeneralOStream gos(std::cout, file);
std::cout << "Hellow world!" << std::endl; //This outputs to console and file
}
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- Visual C++(VS2017)中用户定义的转换不明确
- 使用用户定义的参数调用future/async并调用类方法
- 带有用户定义类的c++折叠表达式
- g++用户定义的动态链接库上的全局new和delete运算符
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 修改"std::set"中用户定义类型的值
- 参数包构造函数在类模板中隐藏用户定义的转换
- MAKE:找不到包含的用户定义的头文件?
- C++:用户定义的显式类型转换函数错误
- 从用户定义的类生成格式字符串?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 向量与用户定义的类比较?(==, <, >)
- STL 用户定义的二进制操作
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- C++:用户定义的类,以成员字段作为地址