Потоковый ввод использует переопределенную операцию сдвига вправо, >>, и называется операцией извлечения, или извлечением. Левый операнд операции >> представляет собой объект типа класса istream. Как и для вывода, правый операнд может быть любого типа, для которого определен вывод потоком.
Пример:
scanf(“%d%f%c”,&i,&f,&c);
заменяется на
cin>>i>>f>>c;
Нет необходимости при вводе данных ставить перед именами переменных оператор взятия адреса &,т.к. в С++ оператор >> вычисляет адрес, определяет формат и прочие особенности записи значения переменной.
Рассмотрим еще один пример:
int i; double d; cin >> i >> d;Последняя строка вызывает пропуск пробельных символов. Цифры, считываемые со стандартного устройства ввода (по умолчанию это клавиатура), преобразуются затем во внутренний двоичный формат и записываются в переменную i. Затем снова пропускаются пробельные символы, и наконец считывается число с плавающей точкой, которое преобразуется и записывается в переменную d.
Для типа char* (рассматриваемого как строка) действие операции >> состоит в пропуске пробельных символов и записи следующих (не пробельных) символов до тех пор, пока не встретится следующий пробельный символ. Затем добавляется завершающий нулевой (0) символ.
Для типа char (signed или unsigned) действие операции >> состоит в пропуске пробельных символов и записи следующего (не пробельного) символа.
Перегрузка оператора >>
Вы можете создавать извлечения для определенных вами типов таким же образом, как это делается со вставками. Используя информацию о структуре, определенной выше, операция >> может быть перегружена следующим образом:
struct info{char name; int val; float units;}
istream& operator >> (istream& s, info& m);
{
s >> m.name >> m.val >> m.units;
return s;
}
В реальных прикладных программах, разумеется, вы можете добавить коды для проверки ошибок ввода. Для считывания строки ввода, такой как "capacity 1.25 liters", можно использовать следующую запись:
cin >> m;
Пример:
struct tclient {char pszname[25]; char pszaddress[30];int pszphone;}
istream& operator >> (istream& isin, tclient client)
{ isin>>client.pszname;
isin>>client.pszaddress;
isin>>client.pszphone;
}
Форматирование потокового ввода-вывода
Существует три способа управления форматом выходных данных: использование флагов, вызов форматирующих функций-элементов, применение манипуляторов.