C++实现同时输出内容到文件与控制台的简洁方案
实现控制台与文件同时输出的简洁方案
当然有简洁的办法啦!你可以自定义一个类似「分流器」的Tee类,让它同时把输出内容转发到控制台和文件,这样原函数的输出逻辑不用重复编写,完全避免代码冗余。
核心思路
创建一个封装了两个输出流(控制台流std::cout和文件流std::ofstream)的类,重载<<运算符,让每次输出操作都同时作用于这两个流。这样你只需要修改原函数里的输出对象,就能一键实现双端输出。
完整代码示例
#include <iostream> #include <fstream> #include <ostream> // 自定义分流输出类 class Tee { private: std::ostream& out1; // 第一个输出目标(比如控制台) std::ostream& out2; // 第二个输出目标(比如文件) public: // 构造函数:传入两个要绑定的输出流 Tee(std::ostream& o1, std::ostream& o2) : out1(o1), out2(o2) {} // 重载<<运算符,处理普通输出内容 template<typename T> Tee& operator<<(const T& value) { out1 << value; out2 << value; return *this; } // 重载<<运算符,处理endl、flush等流操纵符 Tee& operator<<(std::ostream& (*manip)(std::ostream&)) { out1 << manip; out2 << manip; return *this; } }; // 修改原函数,接受Tee对象作为输出目标 void sports(Tee& tee) { tee << "\nGame_Code\t\tGame\t\tCost\t\tStart Time\n"; tee << "\nSP-9651\t\t Game 1 \t\t60\t\t08:00"; tee << "\nSP-9652\t\t Game 2 \t\t60\t\t09:15"; tee << "\nSP-9653..."; } int main() { // 打开目标文件 std::ofstream outputFile("sports_data.txt"); if (!outputFile.is_open()) { std::cerr << "无法打开输出文件!" << std::endl; return 1; } // 创建分流器对象,绑定控制台和文件 Tee dualOutput(std::cout, outputFile); // 调用函数,实现双端输出 sports(dualOutput); // 关闭文件 outputFile.close(); return 0; }
代码说明
Tee类:通过构造函数绑定两个输出流,重载的<<运算符会把内容同时写入这两个流,包括std::endl这类特殊的流操纵符。- 原函数修改:只需要把原来的
cout替换为Tee对象,无需重复编写输出逻辑,完全保留原有代码结构。 - 文件处理:在
main函数中负责打开/关闭文件,确保文件操作的安全性。
这样运行后,控制台会正常输出内容,同时所有输出也会写入sports_data.txt文件中,完美满足你的需求~
内容的提问来源于stack exchange,提问作者Fredrick Chege
相关产品推荐
相关产品推荐

