1 自动关联输入流cin与输出流cout
通常情况下,当从输入流cin中读取数据之前,都会使用输出流cout显示一个提示信息,
int i;
cout << "请输入一个整数:";
cin >> i;
在输入整数之前,在控制台中会显示提示信息。在“C++的缓冲区2-1”中提到,输出流cout是与缓冲区关联的,也就是说提示信息“请输入一个整数:”先被保存到与cout关联的缓冲区中,然后在被输出。因此,我们必须保证从输入流cin中读取数据之前就要能够输出流cout缓冲区中的数据被显示。C++标准库将输入流cin与输出流cout关联在一起,这样任何试图从输入流cin中读取数据的操作都会先刷新与其关联的输出流cout,就保证了在读取输入数据之前会显示提示信息。
2手动关联
在“1 自动关联输入流cin与输出流cout”中提到,C++标准库将cin与cout关联在一起,可以看做是自动关联。而通过basic_ios::tie()函数可以实现关联查询以及手动关联。
2.1 关联查询
不带参数的tie()函数可以实现查询与其关联的流。
ostream* pos = cin.tie();
if (pos == &cout)
{
cout << "cin的关联流是cout";
}
其中,通过tie()函数查询与输入流cin关联的流,此时pos的值就是输出流cout的地址。
2.2 手动关联
可以通过tie()函数实现流的手动关联,其中tie()函数的参数即为要关联的流指针,此时tie()函数的返回值是之前与之关联的流。
ostream* pos = cin.tie(&cerr);
if (pos == &cout)
{
cout << "cin之前关联的流是cout,现在变成cerr了";
}
其中,通过tie()函数将cin与cerr关联,此时pos的值是之前关联的cout的指针。
2.3 解除关联
将tie()函数的参数设置为nullptr,实现解除关联,返回值是之前关联的流指针。
ostream* pos = cin.tie(&nullptr);
此时输入流cin解除了和其它流的关联,pos是之前与之关联的输出流cout的指针。