《C++标准库》学习笔记 — STL —流
一、操控器
所谓操控器是一种专门用来操控 stream 的一种对象,通常它只会改变输入的解释方式或输出的格式化方式。带实参的操控器被定义在 文件中,如 setw 等;不带实参的操控器包括 endl、flush。
1、原理
操控器的实现原理其实是函数指针。在 ostream 中定义了 operator<< 的多种重载,其中包括:
__ostream_type& operator<<(__ostream_type& (*__pf)(__ostream_type&))
{
return __pf(*this);
}
我们通过传入不同的操控器函数指针,即可触发不同的处理。以 endl 为例:
template<typename _CharT, typename _Traits>
inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os)
{
return flush(__os.put(__os.widen('\n'))); }
widen 函数用于国际化相关操作。
2、自定义操控器
参考标准库中操控器的定义,我们可以自定义操控器用于读取忽略一行中的剩余输入:
#include <iostream>
#include <limits>
using namespace std;
template<typename _CharT, typename _Traits>
inline basic_istream<_CharT, _Traits>& ignoreLine(basic_istream<_CharT, _Traits>& is)
{
is.ignore(numeric_limits<streamsize>::max(), is.widen('\n'));
return is;
}
int main(int argc, char* argv[])
{
char ch;
int numOfLinesStartWithA = 0;
while((ch = cin.get()) != 'q')
{
if (ch == 'A')
{
numOfLinesStartWithA++;
}
cin >> ignoreLine;
}
cout << numOfLinesStartWithA << " lines start with A" << endl;
return 0;
}
3、控制输入的宽度
我们可以用 setw 控制输出数据的宽度。此操作符同样可以用于输入上,主要作用在与C风格字符串共同使用:
char buffer[80];
cin >> setw(sizeof(buffer))>> buffer;
这样可以防止输入溢出。
二、自定义 I/O 操作符
假设我们有这样一个处理分数的类:
class Fraction
{
public:
Fraction(int numerator, int denominator):
numerator(numerator),
denominator(denominator)
{
}
int getDenominator() const
{
return denominator;
}
int getNumerator() const
{
return numerator;
}