操控器是什么
std::cout << std::endl;
此句代码中std::endl
为操控器,操控器是用来操控stream对象的,常常只会改变输入或格式化输出的解释方式。
std::cout << std::endl
:输出’\n’,并刷新output缓冲区std::cout << std::ends
:输出’\0’std::cout << std::flush
:刷新output缓冲区std::cin >> std::ws >> strTemp
: 读入并忽略空格
其中std::ws格外给个测试例子(^-^)
//ws是一次性的,执行了任意格式化io操作后,就恢复默认值
char strTemp[16] = { 0 };
std::cin >> std::ws;
while( std::cin.getline( strTemp, sizeof(strTemp) ) )
{
cout << strTemp << endl;
std::cin >> std::ws;
}
操控器运行原理
操控器是一个特定格式的函数,而stream以这个特定格式函数为参数重载了相应的格式操作符<< 、>>。如std::cout << std::endl;
,操作符执行时,碰到std::endl,则以参数std::endl调用相应的<<重载函数(此处叫操控器)。
operator<<实现代码片断:
_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
{ // call basic_ostream manipulator
_DEBUG_POINTER(_Pfn);
return ((*_Pfn)(*this));
}
endl的实现代码片断:
template<class _Elem,
class _Traits> inline
basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{ // insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
自定义操控器
知道了操控器的运行原理,只要按其格式写个函数就行,以下是个输出hello的操控器例子
template<class T, class traits>
inline basic_ostream<T, traits>& out_hello(basic_ostream<T, traits>& os )
{
char szTemp[] = "hello";
os.write( szTemp, sizeof(szTemp) );
return os;
}
int main()
{
cout << out_hello << endl;
return 0;
}