gpt4 book ai didi

c++ - 有没有办法创建一个公共(public)输出流对象以在控制台上打印并打印到 C++ 中的文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:15 26 4
gpt4 key购买 nike

我正在编写代码,我必须在控制台和文件中打印相同的数据。有没有办法填充一个通用的输出流对象,然后使用 cout 在控制台上显示它,并使用 fstream 和 iostream 库将它导出到一个文件?

最佳答案

当然。您只需创建一个合适的流缓冲区,它可能存储到它在内部写入的其他流缓冲区。使用此流缓冲区,您将创建一个要写入的 std::ostream

例如,这里是这种方法的简单实现:

#include <streambuf>
#include <ostream>

class teebuf
: public std::streambuf
{
std::streambuf* sb1_;
std::streambuf* sb2_;

int overflow(int c) {
typedef std::streambuf::traits_type traits;
bool rc(true);
if (!traits::eq_int_type(traits::eof(), c)) {
traits::eq_int_type(this->sb1_->sputc(c), traits::eof())
&& (rc = false);
traits::eq_int_type(this->sb2_->sputc(c), traits::eof())
&& (rc = false);
}
return rc? traits::not_eof(c): traits::eof();
}
int sync() {
bool rc(false);
this->sb1_->pubsync() != -1 || (rc = false);
this->sb2_->pubsync() != -1 || (rc = false);
return rc? -1: 0;
}
public:
teebuf(std::streambuf* sb1, std::streambuf* sb2)
: sb1_(sb1), sb2_(sb2) {
}
};

class oteestream
: private virtual teebuf
, public std::ostream {
public:
oteestream(std::ostream& out1, std::ostream& out2)
: teebuf(out1.rdbuf(), out2.rdbuf())
, std::ostream(this) {
this->init(this);
}
};

#include <fstream>
#include <iostream>

int main()
{
std::ofstream fout("tee.txt");
oteestream tee(fout, std::cout);
tee << "hello, world!\n";
}

关于c++ - 有没有办法创建一个公共(public)输出流对象以在控制台上打印并打印到 C++ 中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com