{ int n,m;
ostream & (*f)(ostream&,int,int);
public:
manip(ostream& (*F)(ostream&,int,int), int N, int M):
f(F), n(N), m(M) {}
friend ostream& operator<<(ostream& s, const manip& obj)
{return obj.f(s,obj.n,obj.m);}
};
ostream& f_man(ostream & s,int n,int m)
{ s.width(n);
s.flags(ios::fixed);
s.precision(m);
return s;
}
manip wp(int n,int m)
{ return manip(f_man,n,m);
}
int main()
{ cout<< 2.3456 << endl;
cout<<wp(8,1)<<2.3456 << endl;
return 0;
}
Компонента-функция put и вывод символов
Компонента-функция ostream::put() используется для вывода одиночного символа:
char c=’a’;
...
cout.put(c);
Вызовы функции put() могут быть сцеплены:
cout.put(c).put('b').put('\n');
в этом случае на экран выведется буква а, затем b и далее символ новой строки.
Компоненты-функции get и getline для ввода символов.
Функция istream::get() может быть использована в нескольких вариантах.
Первый вариант – функция используется без аргументов. Вводит из соответствующего потока одиночный символ и возвращает его значение. Если из потока прочитан признак конца файла, то get возвращает EOF.
#include<iostream>
using namespace std;
int main()
{ char c;
cout << cin.eof()<< " вводите текст" << endl;
while((c=cin.get())!=EOF)
cout.put(c);
cout << endl<<cin.eof();
return 0;
}
В программе считывается из потока cin очередной символ и выводится с помощью функции put. При считывании признака конца файла (Ctrl+z) завершается цикл while. До начала цикла выводится значение, возвращаемое функцией cin.eof(), равное false (выводится 0). После окончания цикла выводится значение true (выводится 1).
Второй вариант – когда функция get() используется с одним символьным аргументом. Функция возвращает false при считывании признака конца файла, иначе − ссылку на объект класса istream, для которого вызывалась функция get.
...
while(сin.get(с))
cout.put(c);
...
При третьем варианте функция get() принимает три параметра: указатель на символьный массив (строку), максимальное число символов и ограничитель ввода (по умолчанию '\n'). Ввод прекращается, когда считано число символов на один меньшее максимального или считан символ-ограничитель. При этом во вводимую строку добавляется нуль-символ. Символ-ограничитель из входного потока не удаляется, это при повторном вызове функции get приведет к формированию пустой строки.
сhar s[30];
...
сin.get(s,20)) // аналогично cin.get(s,20, '\n')
cout<<s<<endl;
...
Функция isteram::getline() действует аналогично функции get() с тремя параметрами с тем отличием, что символ-ограничитель удаляется из входного потока.
Ниже коротко рассмотрены другие функции-компоненты класса istream.