在 c++ 中独立于平台的 /dev/null
Platform independent /dev/null in c++
可能的重复项:
实现无操作标准::ostream
在 c++ 中是否有任何等效于 NULL 的流?我想编写一个函数,如果用户希望将内部输出到某个地方,则接收流,但如果没有,输出将进入某个假位置
void data(std::stream & stream = fake_stream){
stream << "DATA" ;
}
我希望能够选择做data()
或data(std::cout)
编辑:取自@Johannes Schaub - litb的邮件,略有修改:
template<typename Ch, typename Traits = std::char_traits<Ch> >
struct basic_nullbuf : std::basic_streambuf<Ch, Traits> {
typedef std::basic_streambuf<Ch, Traits> base_type;
typedef typename base_type::int_type int_type;
typedef typename base_type::traits_type traits_type;
virtual int_type overflow(int_type c) {
return traits_type::not_eof(c);
}
};
// convenient typedefs
typedef basic_nullbuf<char> nullbuf;
typedef basic_nullbuf<wchar_t> wnullbuf;
// buffers and streams
// in some .h
extern std::ostream cnull;
extern std::wostream wcnull;
// in a concrete .cpp
nullbuf null_obj;
wnullbuf wnull_obj;
std::ostream cnull(&null_obj);
std::wostream wcnull(&wnull_obj);
使用这些:
void data(std::ostream& stream = cnull){
// whatever...
}
现在,这看起来很酷,但以下内容更短且有效,因为如果向 ostream
的构造函数提供空指针,它会自动设置 badbit 并静默忽略任何写入:
// in .h
extern std::ostream cnull;
extern std::wostream wcnull;
// in .cpp
std::ostream cnull(0);
std::wostream wcnull(0);
该标准保证了这一点,从描述ostream
的构造函数开始27.6.2.2 [lib.ostream.cons] p1
它接受指向streambuf
的指针:
效果:构造类
basic_ostream
的对象,通过调用basic_ios<charT,traits>::init(sb)
为基类赋值。
basic_ios
的相关函数27.4.4.1 [lib.basic.ios.cons] p3
:
void init(basic_streambuf<charT,traits>* sb);
后置条件:此函数的后置条件如表 89 所示:
表 89 中的重要行:
rdstate(( -- 如果 sb 不是空指针,则为 goodbit,否则为 badbit。
如果设置了badbit
会发生什么情况,请参见27.6.2.6 [lib.ostream.unformatted]
:
每个未格式化的输出函数通过构造类
sentry
的对象开始执行。如果此对象返回 true,则在转换为 bool 类型的值时,该函数将努力生成请求的输出。
这意味着,如果sentry
是假的,它就不是假的。以下是sentry
如何转换为bool
,取自27.6.2.3 [lib.ostream::sentry] p3 & p5
:
3(如果在任何准备完成后,
os.good()
true
,ok_ == true
其他情况,ok_ == false
。5(
operator bool();
效果:返回ok_。
(ok_
是类型 bool
的ostream::sentry
的成员。
请注意,这些引号仍然存在于 C++11 中,只是在不同的地方。按照此答案中出现的顺序:
-
27.6.2.2 [lib.ostream.cons] p1
=>27.7.3.2 [ostream.cons] p1
-
27.4.4.1 [lib.basic.ios.cons] p3
=>27.5.5.2 [basic.ios.cons]
表 - 89 => 表 128
-
27.6.2.6 [lib.ostream.unformatted]
=>27.7.3.7 [ostream.unformatted] p1
-
27.6.2.3 [lib.ostream::sentry] p3 & p5
=>27.7.3.4 [ostream::sentry] p4 & p5
Linux 文件/dev/null 是一个黑洞,就像你要找的那样。 在Windows中,有一个名为NUL:的设备。 我从未尝试打开该文件,但我从命令行使用它
你可以试试ostream(NULL,false(,第一个输入是目标输出,我不知道第二个输入是什么意思,但在跟踪代码之后,似乎只是因为ostream没有地方可以写入,调用operator <<
只是被ostream忽略了。我的意思是在第一次调用状态更改为 bad,之后它总是因为流状态而忽略输入数据,所以您可以使用以下代码:
void data(std::ostream & stream = ostream(NULL,false)){
stream << "DATA" ;
}
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 如何将 stderr 重定向到 /dev/null
- 如何检测 ofstream 是否正在写入 /dev/null
- 管道到 /dev/null 时出现未指定的iostream_category错误(iOS::badbit 问题?
- 重定向函数输出到/dev/null
- "- < /dev/null"在"gcc -dM -E - < /dev/null"中是什么意思?
- 如何在c++和linux中将std::ostream重定向到文件或/dev/null
- 在 c++ 中独立于平台的 /dev/null
- 为什么重定向wcout/wcerr到/dev/null会导致程序崩溃?