Class manip

{ 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.