o字符串流在插入输出后为空
ostringstream is empty after inserting output to it
我有一个奇怪的问题,即使我在其中插入输出,ostringstream 也是空的。 这是我的代码:
//logger.h
#include <string>
#include <iostream>
#include <sstream>
using std::string;
class BasicLogger {
public:
BasicLogger(const string name);
BasicLogger(const BasicLogger& basicLogger);
~BasicLogger();
template<class T>
BasicLogger& operator<<(const T &msg){
std::cout << "msg is: " << msg << std::endl;
mBuf << msg;
std::cout << "mBuf is: " << mBuf.str() << std::endl;
return *this;
}
private:
string mName;
std::ostringstream mBuf;
};
class Logger {
public:
Logger();
~Logger();
BasicLogger info();
BasicLogger error();
private:
BasicLogger mInfoLogger;
BasicLogger mErrorLogger;
};
//logger.cpp
#include "logger.h"
BasicLogger::BasicLogger(const string name):
mName(name) { }
BasicLogger::BasicLogger(const BasicLogger& otherLogger) {
this->mName = otherLogger.mName;
this->mBuf << otherLogger.mBuf.rdbuf();
}
BasicLogger::~BasicLogger() { }
Logger::Logger():
mInfoLogger("[INFO]"),
mErrorLogger("[ERROR]") {}
Logger::~Logger() {};
BasicLogger Logger::info() {
return mInfoLogger;
}
BasicLogger Logger::error() {
return mErrorLogger;
}
//main.cpp
#include "logger.h"
int main() {
Logger logger;
logger.info() << "Hellooo";
}
输出为
msg is: Hellooo
mBuf is:
虽然@BoPersson已经为您提供了解决方案,但我想解释一下这里发生了什么,以及为什么您的输出是空的,即使您在显示其内容之前添加到行上的ostringstream
。
我认为当您尝试按值返回mInfoLogger
时,编译器抱怨无法返回它,因为复制构造函数被删除。由于您拥有的成员而删除ostringstream
原因是不可复制的。
因此,您提供了自定义复制构造函数并尝试以这种方式复制流:
this->mBuf << otherLogger.mBuf.rdbuf();
只有这不会复制任何内容,因为您的rdbuf
为空,而是failbit
故障位
basic_ostream::运算符的 streambuf 重载<<如果函数 不插入任何字符。 http://en.cppreference.com/w/cpp/io/ios_base/iostate
如果您要像这样检查邮件插入:
if (!(mBuf << msg))
std::cout << "Not Inserted" << std::endl;
您将看到打印Not Inserted
消息。有很多方法可以使其打印所需的消息。例如,确保您的rdbuf
缓冲区不为空,或者在重用mBuf
之前重置failbit
,类似于mBuf.clear();
或简单地将引用返回到mInfoLogger
(和mErrorLogger
(。然后你可以安全地摆脱你的复制构造函数。
相关文章:
- 如何在 html 页面中插入 cgi 应用程序的输出?
- 在插入容器之前转换输出迭代器
- 多次插入 (<<) 与串联输出 (+)
- 在输出流中插入换行符
- 在控制台上输出我从文件中读取的整数,将程序插入无限循环
- 插入了 C++ 数组字符串数据,但在显示输出时不显示
- o字符串流在插入输出后为空
- 插入排序打印错误的输出
- 为什么我在链表中插入的代码没有得到任何输出?
- 获取有趣的输出以进行插入排序
- 奇怪的程序输出,并进行插入后
- 插入std :: basic_ostream实例化输出时的内存故障
- 如何检测到插入/输出Oculus触摸控制器
- 在队列中,插入和删除后,被删除的元素也会出现在输出中.为什么
- 灵气:在规则中插入预定义的输出
- 默认情况下构造函数插入数据后,我没有得到任何输出,但我不确定为什么不
- 插入标准::结束后输出奇怪
- 插入到多个输出流中
- 格式化的输出算术插入器
- 检测圆括号,括号和大括号是否平衡的c++程序-需要在错误下输出插入符号