创建 ostream 到 file 或 cout 的正确方法

2024-01-27

我正在尝试为我在学校的项目创建一个日志类。它需要能够将信息写入标准输出或文件,具体取决于传递的参数。我正在研究如何做到这一点,我偶然发现了一个有类似问题的线程:从 std::cout 或 std::ofstream(file) 获取 std::ostream https://stackoverflow.com/questions/366955/obtain-a-stdostream-either-from-stdcout-or-stdofstreamfile

这个线程和我自己的线程之间的唯一区别是我想在类内部执行它。尽管他们使用了解决方案std::ostream out(buf)并使用 buf 动态构建 ostream。如何在 Log 类中正确声明这一点,以便仅在输入 Log 构造函数后才能构造“out”对象?

我在下面快速浏览了一下,但我不确定它是否正确,或者我是否走在正确的轨道上。感谢任何帮助,谢谢。

编辑:我希望能够做到out << "Some string" << endl;当我让这个 Log 类正常工作后。

EDIT2:我现在收到以下新代码的错误error : 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits<char>]' is protected

// log.h
#include <string>
#include <fstream>

#ifndef LOG_H_
#define LOG_H_

class Log 
{
    public:
        enum Mode { STDOUT, FILE };

        // Needed by default
        Log(const char *file = NULL);
        ~Log();

        // Writing methods
        void write(char *);
        void write(std::string);
    private:
        Mode mode;
        std::streambuf *buf;
        std::ofstream of;
        std::ostream out;
};

#endif


// log.cpp
#include "log.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>

Log::Log(const char *file)
{
    if (file != NULL)
    {
        of.open(file);
        buf = of.rdbuf();
        mode = FILE;
    }
    else
    {
        buf = std::cout.rdbuf();
        mode = STDOUT;
    }

    // Attach to out
    out.rdbuf(buf);
}

Log::~Log()
{
    if (mode == FILE)
        of.close();
}

void Log::write(std::string s)
{
    out << s << std::endl;
}

void Log::write(char *s)
{
    out << s << std::endl;
}

你创造tmp with std::ostream tmp(buf);并将其地址存储在out with this->out = &tmp;。然而,tmp将在构造函数末尾超出范围,并且指针将不再指向有效对象。

你应该做的是out not a std::ostream*但只是一个std::ostream:

std::ostream out;

然后在你的构造函数中,一旦你得到了buf准备好了,你可以把它给out通过做out.rdbuf(buf);.


回复编辑:

The std::ostream没有默认构造函数 - 它必须采用缓冲区指针。我的错。不过,修复方法很简单。使用构造函数的成员初始化列表来传递空指针(nullptr在 C++11 中,0 or NULL在 C++03 中):

Log::Log(const char *file)
  : out(nullptr)
{
  // ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 ostream 到 file 或 cout 的正确方法 的相关文章

  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier

随机推荐

  • 获取 blob 的 url 时出现 image/png 的未知格式错误

    我收到此错误 ActionController UnknownFormat ErrorPagesController not found is missing a template for this request format and v
  • AttributeError:“数据集”对象没有属性“值”

    使用包读取 hdf5 文件时出现此错误 dataset value Error Traceback most recent call last File train py line 163 in
  • 静态数组与动态数组的 C/C++ 性能

    当性能对应用程序至关重要时 是否应该考虑是否在堆栈上声明数组还是在堆上声明数组 请允许我概述一下为什么会想到这个问题 由于 C C 中的数组不是对象并且会退化为指针 因此编译器使用提供的索引来执行指针算术来访问元素 我的理解是这个程序dif
  • Microsoft.Internal.Assumes+InternalErrorException:发生内部错误

    我在尝试加载 Visual studio 2012 时遇到了此错误 遇到了异常 这可能是由扩展引起的 并在中给出了附加信息的位置C Users AppData Roaming Microsoft VisualStudio 11 0 Acti
  • 无法执行tools\android.bat:解决方法

    当我尝试在 Eclipse 中打开 SDK 管理器时 它说很快就会打开 但从未打开 我尝试打开 exe 文件 但它显示一条错误消息 无法执行tools android bat 系统找不到指定的文件 我的路径环境变量将其引导至工具文件夹 这是
  • 为什么我会得到这些连字符?

    我正在尝试使用 div 制作 3 个按钮 并使用百分比水平对齐它们 我设法做到了这一点 但我在 div 之间得到了这些连字符 仅当我使用 display inline block 时 连字符才会出现 但如果没有它 我无法以这种方式对齐它们
  • 定义取决于缩进级别的语法区域

    我正在尝试在 Vim 中为 reStructuredText 构建一个更轻的语法文件 首先 文字块在行尾遇到 时开始 I ll show you some code if foo bar then do something end Lite
  • 我可以使用 BroadcastReceiver 的回调方法吗?

    在学习使用 Android 中的 BroadcastReceiver 类时 我编写了一个小程序来接收电池充电状态并将其写入活动中的三个 TextView 字段 不过 我已将 BroadcastReceiver 作为一个单独的类 以使其更加简
  • 如何将一个 xib 中的 UIViewController 视图嵌入到另一个 xib 的视图中?

    MyViewController xib 将 File s Owner 类设置为MyViewController 的子类UIViewController 和文件所有者视图连接到UIView包含一些子视图 OtherViewControlle
  • 用点填充行中剩余的空白(多行文本)

    I m trying to get an html page to look something like this 我已经非常接近了 但我想再迈出一步 尝试用点填充文本中的所有空白 直到行尾 全部不用js 我找到了针对单行元素的不同解决方
  • 在 JavaScript 中取消转义 HTML 实体?

    我有一些与 XML RPC 后端通信的 JavaScript 代码 XML RPC 返回以下形式的字符串 img src myimage jpg 但是 当我使用 JavaScript 将字符串插入 HTML 时 它们会按字面意思呈现 我没有
  • 单击图像时动画不重复

    单击 aTextview我正在使用以下代码片段进行帧动画 imgclickanimation setBackgroundResource R anim clickframeanimation ribinclickanimation Anim
  • 使用 TFS 2012 API,如何获取用户的电子邮件地址?

    我正在尝试使用 API 获取 TFS 2012 中特定用户的电子邮件地址 我已在 个人资料 部分中设置了用户的首选电子邮件地址 我在网上做了很多搜索并得到了以下代码 var userId myUserId var collection ne
  • 如何删除警告“从‘int’转换为‘char’可能会改变其值”

    我想如果我cast像这样的数字 unsigned char 32这足以修复编译器警告 但这并不像我计划的那样 这里我有程序的以下部分 它实际上解释了问题 include
  • 为所有 EditText 设置一致的样式(例如)

    我正在努力让一切EditText在我的应用程序中具有一致的外观 我知道我可以做这样的事情 然后我可以做一个特定的EditText通过这样做有这种风格
  • git post-receive hook 未运行捆绑安装

    我在运行接收后挂钩时遇到问题 如下所示 bin sh unset git rev parse local env vars cd commodity git pull origin master bundle install bundle
  • qt Creator 中的提升功能是什么?它是如何工作的?

    我制作了一个播放音频视频的应用程序 但我无法从 qt Creator 找到 QVideowidget 我如何将其添加到 gui 布局中 可以推广到功能帮助吗 有没有办法在 qopengl 小部件中播放视频 qvideo 小部件的任何替代方案
  • Git:如何用master更新分支?

    这是我的情况 我已经开始了一个新的分支 我们称之为foo 并为此做了一些工作 我已经推了foo远程 需要做一些事情master 所以我切换到master 进行了修复并推送 现在 我如何更新foo with master 因为我需要努力foo
  • 使用 php 和 ajax 从文件中分页

    我想在 php 中使用 ajax 进行分页 并且数据来自文件 在搜索关键字时 页面显示文件中的前 20 条记录 但现在我想要文件中的下一条剩余记录 它应该使用分页 请问有什么建议吗 keyword POST data file file g
  • 创建 ostream 到 file 或 cout 的正确方法

    我正在尝试为我在学校的项目创建一个日志类 它需要能够将信息写入标准输出或文件 具体取决于传递的参数 我正在研究如何做到这一点 我偶然发现了一个有类似问题的线程 从 std cout 或 std ofstream file 获取 std os