【C++進階】C++創建文件/屏幕輸出流類(將信息同時輸出到文件和屏幕)

在軟件的調試技術中,很重要的一個技術是將軟件運行過程中的一些信息寫入到“日志文件”中。但是同時還要將信息顯示到屏幕上,以方便程序員實時查看這些信息。
最簡單的一種辦法是這樣的:

std::ofstream output("debug.log", ios::out);
output << __FILE__ << ":" << __LINE__ << "\t" << "Variable x = " << x;
cout << __FILE__ << ":" << __LINE__ << "\t" << "Variable x = " << x;

不過,上面的代碼看起來很愚蠢。
下面使用streambuf構造一個自己的類,來實現這個功能

#include <streambuf>
#include <iostream>
#include <fstream>//Linux tee命令用于讀取標準輸入的數據,并將其內容輸出成文件。
//tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。
class teebuf : public std::streambuf
{
public:// Construct a streambuf which tees output to both input// streambufs.teebuf(std::streambuf* sb1, std::streambuf* sb2): sb1(sb1), sb2(sb2){}
private:// This tee buffer has no buffer. So every character "overflows"// and can be put directly into the teed buffers.virtual int overflow(int c){if (c == EOF){return !EOF;}else{int const r1 = sb1->sputc(c);int const r2 = sb2->sputc(c);return r1 == EOF || r2 == EOF ? EOF : c;}}// Sync both teed buffers.virtual int sync(){int const r1 = sb1->pubsync();int const r2 = sb2->pubsync();return r1 == 0 && r2 == 0 ? 0 : -1;}
private:std::streambuf* sb1;std::streambuf* sb2;
};class teestream : public std::ostream
{
public:// Construct an ostream which tees output to the supplied// ostreams.teestream(std::ostream& o1, std::ostream& o2);
private:teebuf tbuf;
};teestream::teestream(std::ostream& o1, std::ostream& o2): std::ostream(&tbuf), tbuf(o1.rdbuf(), o2.rdbuf())
{
}int main()
{std::ofstream output("debug.log");//1、創建文件/屏幕輸出流對象teeteestream tee(std::cout, output);auto x = 1.1;tee << __FILE__ << ":" << __LINE__ << "\t" << "Variable x = " << x;return 0;
}

效果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五、加載數據集

之前寫過加載數據集的一些小筆記&#xff0c;這里詳細內容就不再敘述了 詳細學習可以參考該博文二、PyTorch加載數據 一、分析 因為U-net網絡架構是輸入1通道&#xff0c;大小為(572,572)的灰度圖&#xff0c;圖片大小無所謂&#xff0c;我的思路是將三通道的圖像使用OpenCV進…

CDMA的完整形式是什么?

CDMA&#xff1a;碼分多址 (CDMA: Code Division Multiple Access) CDMA is an abbreviation of Code Division Multiple Access. Code Division Multiple Access is a digital cellular technology and displays a network of multiple accesses. The various radio communica…

BCD碼與十進制的相互轉換

BCD碼是用每四位代替一位十進制數&#xff08;0 到 9 的某一位數&#xff09; 例如&#xff1a;0x25 就代表25 十六進制的每位轉換成二進制代表四個位。 下面是bcd轉char short int long c語言程序 //************************************************************…

DSP關于存儲器讀寫、IO讀寫時序圖的注意點

這里的存儲器圖不涉及插入等待周期。 IO設備的圖可以自行減去插入等待周期&#xff0c;然后觀察。 存儲器讀讀寫 存儲器寫寫讀 I/O設備讀寫操作

折騰430 launchpad

launchpad到手也已經很長時間了&#xff0c;團購了一個g2的&#xff0c;一個鐵電的&#xff0c;現在馬上又要來一個g2的&#xff0c;感覺手上的東西太多了&#xff0c;急需消化一下&#xff0c;首先呢還是先把430搞定吧。 ---------------------------------------------------…

oem模式是什么_OEM的完整形式是什么?

oem模式是什么OEM&#xff1a;原始設備制造商 (OEM: Original Equipment Manufacturer) OEM is an abbreviation of "Original Equipment Manufacturer". Its meaning has changed over time. In former times, it alluded to a corporation that manufactures produ…

媽了個巴卡

配置文件修改&#xff1a; 一、打開PC端微信&#xff0c;打開咩了個咩小程序&#xff0c;點進入第一關&#xff0c;之后再關掉小程序 二、PC端微信設置里面&#xff0c;找到管理文件&#xff0c;打開文件夾 三、Applet下按修改日期找到a9結尾的文件 四、接著進入\usr\gamecac…

java中Iterator的小程序

import java.util.Collection; import java.util.HashSet; import java.util.Iterator;public class TestIterator {public static void main(String[] args){Collection booksnew HashSet();books.add("java講義");books.add("java的Ajax寶典");books.add…

【C++進階】利用重載二元運算符改進平面向量類Vec2D

先前回顧 在【C進階】 遵循TDD原則&#xff0c;實現平面向量類(Vec2D)中我們初步實現了Vec2D內容&#xff0c;現在做出一定的改進&#xff1a; 實現Vec2D的一半二元算數運算符重載 1、 - (兩個Vec2D對象運算以及1個Vec2D對象與一個double數運算) 2、*(點乘和數乘) 同時將之前…

在SQL中使用DEFAULT約束

DEFAULT constraint is used to insert default value into a column on a table and if no any value is stored in any place of a column then default value will be added into it. DEFAULT約束用于將默認值插入到表的列中&#xff0c;如果列的任何位置均未存儲任何值&…

(ios7) 解決代碼布局View, ios7 中 subView 高度增加StatusBar20dp的問題,保證Ios6,ios7代碼一致...

在ios7 布局中&#xff0c;Status Bar 和 ToolBar &#xff0c;NavigateBar 等都包含在ViewControl的主View中。 這樣原來ios6 的View布局 整體向上移動了20dp&#xff0c;下面是保證ios6,ios7代碼一致的解決方案 1 第一步 在項目的Info.plist 文件中 添加一行屬性配置 View co…

簡單的群體測試方案C++代碼(Group testing against Covid-19)

原理參考鏈接 https://www.econstor.eu/handle/10419/221811 http://www.magigen.com/h-nd-348.html 文章原理回顧 文章比較了兩種估計人群中病毒流行率的方法&#xff1a; 1、個體測試&#xff0c;即對12000人的樣本進行病毒測試&#xff0c;并采用標準二項測試得出95%的置…

使用WinDbg和VMware調試NDIS中間層驅動程序 (轉)

使用WinDbg和VMware調試NDIS中間層驅動程序 我這里將一步一步的介紹&#xff0c;是從新手的角度來講的&#xff0c;所以對高手來說&#xff0c;可能有些啰嗦。如果你看完這篇文章還不知道如何設置&#xff0c;那么原因可能有兩個&#xff1a;1. 我沒講好&#xff1b;2. 你需要稍…

c語言字符常量和字符串常量_C語言中的字符常量

c語言字符常量和字符串常量Any character (a single character) that is enclosed within the single quotes (like, A) is called character constants in C programming language. 用單引號引起來的任何字符(單個字符)(例如A ) 在C編程語言中稱為字符常量 。 Character cons…

DDOS小測試

一、F12打開開發者工具&#xff0c;刷新待攻擊的網站&#xff0c;重新獲得一次請求 二、user-agent為瀏覽器的合法標識符 user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 是鍵值對的形式&…

Scrum輕松之旅_人員

Product owner產品負責人 職責&#xff1a;確定產品功能 確定產品發布日期 為產品收益率負責 根據商業價值確定功能優先級 接受或拒絕Team的開發成果 Scrum master教練 Team團隊轉載于:https://www.cnblogs.com/charles-x/archive/2012/06/14/2549943.html

群體測試中的假陰性影響

群體測試中的假陰性比個體測試中的假陰性風險要大得多。如果一組樣本被感染&#xff0c;該組中的每個樣本都可能被感染。因此&#xff0c;如果該受感染池的檢測結果為假陰性&#xff0c;則該結果表明池中的每個人都沒有感染。此外&#xff0c;在群體試驗中混合樣本會使受感染的…

融合注意力機制的YOLOv5火焰識別+Arduino UNO R3實現5s內連續識別到火焰,警報燈紅燈亮起

效果&#xff1a;攝像頭捕獲室內圖像&#xff0c;將視頻實時通過串口通訊傳遞給改進之后的YOLOv5神經網絡進行火焰識別&#xff0c;若5s內連續檢測到有火焰&#xff0c;警報燈變紅&#xff0c;進入危險狀態。5s之內未連續出現火焰&#xff0c;警報燈變綠&#xff0c;進入安全狀…

小數 ###_C#中的小數關鍵字

小數 ###C&#xff03;十進制關鍵字 (C# decimal keyword) In C#, decimal is a keyword which is used to declare a variable that can store a floating type value (value with the precision) between the range of 1.0 x 10-28 to 7.9228 x 1028. decimal keyword is an …

Moon.Orm性能報告

以下為有網友公司的評估測試及使用規范 大家可以下載word看看 http://pan.baidu.com/s/1hquvRuc 一、和ADO.NET進行的壓力測試 說明&#xff1a;2000并發用戶&#xff0c;此圖為一網友公司對moon.orm的測評 二、和ADO.NET的性能對比測試 說明&#xff1a;同時請求10000條數據&a…