创建 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 的正确方法 的相关文章

随机推荐

  • 获取 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