定义于头文件 <ostream>
template< class CharT, |
类模板 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::cout
和 std::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::cerr
和 std::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 (对 wcerr
和 wcout
相同),这表示任何 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::clog
和 std::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";
}
输出