基本技能11.6:创建自己的控制器函数
C++允许我们创建自己的控制器函数。控制器函数分为两种:带参数的和不带参数的。自行定义带参数的控制器函数涉及到的知识超出了本书所要涉及的内容,我们在此不做讨论。创建不带参数的控制器函数则是比较简单的,将在下面进行讨论。
所有不带参数的控制器输出函数都有着下面的结构:
ostream &manip_name(ostream &stream)
{
// 自己的代码
return stream;
}
其中,manip_name就是控制器的名字。有重要的一点需要理解:尽管上面的形式中控制器参数为一个指向流的指针,但是在输出表达式中使用该控制器的时候是不需要指定任何参数的。
下面的程序中,我们创建了一个名为setup()的控制器,用来打开左对齐的标记开关,设置宽度为10,并且设置填充字符为美元符号。
#include <iostream> #include <iomanip> using namespace std; //自定义控制器 ostream &setup(ostream & stream ) { stream.setf(ios::left); stream << setw(10) << setfill('); return stream; } int main() { cout << 10 << " " << setup << 10; return 0; }
自定义控制器在下面两种情况下会显得非常用用:第一,在我们需要对某种设备进行输入/输出操作,但是系统原先定义的控制器不能满足我们的要求,例如绘图仪。此时创建自己的控制器会使得输出到绘图仪的操作更加方便。第二,我们有可能在输入/或者输出的时候多次重复一段相同的格式控制语句,那么我们就可以把这种操作合并为一个简单的控制器,如下面的程序演示的那样。
例如,在下面的程序中,我们创建了一个名称为prompt()控制器。它用于显示提示信息,然后配置输入格式为16进制。
//创建一个收入控制器 #include <iostream> #include <iomanip> using namespace std; istream &prompt(istream &stream) { cin >> hex; cout << "Enter number using hex format:"; return stream; } int main() { int i; cin >> prompt >> i; cout << i; return 0; }
必须注意的是:自定义的控制器必须返回一个流对象;否则,这个控制器将不能在输入或者输出的链式表达式中使用。
文件输入/输出
我们可以使用C++的输入/输出系统来进行文件的输入/输出。此时,我们需要在程序中包含头文件<fstream>,其中定义了几个非常重要的类和值。
练习
1. endl是用来做什么的?
2. ws是用来做什么的?
3. 输入/输出控制器通常是被用作更大的输入/输出表达式的一部分,对吗?