c++11 标准模板(STL)预定义标准流对象

预定义标准流对象

从标准 C 输入流 stdin 中读取

std::cin, 
std::wcin

extern std::istream cin;

(1)

extern std::wistream wcin;

(2)

全局对象 std::cinstd::wcin 控制来自实现定义类型(导出自 std::streambuf )的流缓冲区的输入,与标准 C 输入流 stdin 关联。

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

如果不使用 sync_with_stdio(false), 则从多个线程访问这些对象,进行有格式和无格式输入是安全的。

一旦构造 std::cin , std::cin.tie() 就返回 &std::cout ,类似地 std::wcin.tie() 返回 &std::wcout 。这表示若有任何字符正在等待输出,则任何 std::cin 上的格式化输入操作会强制调用 std::cout.flush() 。

注意

名称中的 'c' 指代“character”( stroustrup.com FAQ ); cin 表示“字符输入”而 wcin 表示“宽字符输入”。

调用示例

#include <iostream>

struct Foo
{
    int n;
    Foo()
    {
        std::cout << "Enter n: "; // 不需要冲入
        std::cin >> n;
    }
};

Foo f; // static object

int main()
{
    std::cout << "f.n is " << f.n << '\n';
    return 0;
}

输出 

写入到标准 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" << std::endl;
    return 0;
}

输出

 写入到标准 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();
    return 0;
}

输出

写入到标准 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" << std::endl;
    }
    ~Foo()
    {
        std::clog << "static destructor" << std::endl;
    }
};

Foo f; // 静态对象

int main()
{
    std::clog << "main function" << std::endl;
}

输出

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/132630322