c++11 标准模板(STL)(std::basic_ostream)(二)

博客介绍了C++类模板basic_ostream,它提供字符流上的高层输出操作,包括有格式和无格式输出。标准库提供六个全局basic_ostream对象,分别可写入标准C输出流stdout、标准C错误流stderr(无缓冲)和标准C错误流stderr,还说明了各对象的初始化、线程安全及关联等情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义于头文件 <ostream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_ostream : virtual public std::basic_ios<CharT, Traits>

类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式输出(例如整数值)和无格式输出(例如生字符和字符数组)。此功能以 basic_streambuf 类所提供的接口实现,通过 basic_ios 基类访问。典型的实现中, basic_ostream 无非继承的数据成员。

 

全局对象

标准库提供六个全局 basic_ostream 对象。

写入到标准 C 输出流 stdout

std::cout, 
std::wcout

extern std::ostream cout;

(1)

extern std::wostream wcout;

(2)

 全局对象 std::coutstd::wcout 控制到实现定义类型流缓冲(导出自 std::streambuf )的输出,它与标准 C 输出流 stdout 关联。

保证这些对象在首次构造 std::ios_base::Init 类型对象期间或之前初始化,并可用于拥有有序初始化的静态对象的构造函数和析构函数(只要在定义对象前包含 <iostream> )。

除非发行 sync_with_stdio(false) ,否则从多个线程为有格式和无格式输出同时访问这些对象是安全的。

一旦初始化,则 std::cout 被 tie() 到 std::cin 而 std::wcout 被 tie() 到 std::wcin ,这表示任何 std::cin 上的输入操作执行 std::cout.flush() (通过 std::basic_istream::sentry 构造函数)。

一旦初始化,则 std::cout 亦被 tie() 到 std::cerr 而 std::wcout 被 tie() 到 std::wcerr ,这表示任何 std::cerr 上的输入操作执行 std::cout.flush() (通过 std::basic_istream::sentry 构造函数)。(C++11)

注意

名称中的 'c' 指代“字符”( stroustrup.com FAQ ); cout 表示“字符输出”而 wcout 表示“宽字符输出”。

调用示例

#include <iostream>
struct Foo
{
    int n;
    Foo()
    {
        std::cout << "static constructor\n";
    }
    ~Foo()
    {
        std::cout << "static destructor\n";
    }
};

Foo f; // 静态对象

int main()
{
    std::cout << "main function\n";
}
输出

 

写入到标准 C 错误流 stderr, 无缓冲

std::cerr, 
std::wcerr

extern std::ostream cerr;

(1)

extern std::wostream wcerr;

(2)

 全局对象 std::cerrstd::wcerr 控制到实现定义类型(分别导出自 std::streambuf 和 std::wstreambuf )的流缓冲,与标准 C 错误输出流 stderr 关联。

保证这些对象在构造首个 std::ios_base::Init 类型对象之前或期间得到初始化,而且可用于带有序初始化的静态对象的构造函数和析构函数(只要在定义对象前包含 <iostream> )。

除非发布 sync_with_stdio(false) ,从多个线程为有格式和无格式输出访问这些对象是安全的。

一旦初始化,则 (std::cerr.flags() & unitbuf) != 0 ( wcerr 也一样),这表示任何发送给这些流对象的输出都被立即冲入到 OS (通过 std::basic_ostream::sentry 的析构函数)。

另外, std::cerr.tie() 返回 &std::cout (对 wcerrwcout 相同),这表示任何 std::cerr 上的输出首先执行 std::cout.flush() (通过 std::basic_ostream::sentry 的构造函数)。(C++11 起)

注意

名称中的 'c' 指代“字符”( stroustrup.com FAQ ); cerr 表示“字符错误(流)”而 wcerr 表示“宽字符错误(流)”。

调用示例

#include <thread>
#include <iostream>
#include <chrono>

void f()
{
    std::cout << "Output from thread...";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "...thread calls flush()" << std::endl;
}

int main()
{
    std::thread t1(f);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::clog << "This output from main is not tie()'d to cout\n";
    std::cerr << "This output is tie()'d to cout\n";
    t1.join();
}
输出

 

写入到标准 C 错误流 stderr

std::clog, 
std::wclog

extern std::ostream clog;

(1)

extern std::wostream wclog;

(2)

 全局对象 std::clogstd::wclog 控制实现定义类型(导出自 std::streambuf )的流缓冲,与标准 C 输出流 stderr 关联,但不同于 std::cerr/std::wcerr ,不自动冲入这些流,且不自动与 cout tie() 。

保证这些对象在构造首个 std::ios_base::Init 类型对象之前或期间得到初始化,而且可用于带有序初始化的静态对象的构造函数和析构函数(只要在定义对象前包含 <iostream> )。

除非发布 sync_with_stdio(false) ,从多个线程为有格式和无格式输出访问这些对象是安全的。

注意

名称中的 'c' 指代“字符”( stroustrup.com FAQ ); clog 表示“字符日志”而 wclog 表示“宽字符日志”。

调用示例

#include <iostream>

struct Foo
{
    int n;
    Foo()
    {
        std::clog << "static constructor\n";
    }
    ~Foo()
    {
        std::clog << "static destructor\n";
    }
};

Foo f; // 静态对象

int main()
{
    std::clog << "main function\n";
}
输出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值