Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

12.2 Переадресація вводу-виводу

Імена cin та сout можна перепризначати для специфічних об'єктiв-потокiв користувача. Така можливість дозволить в програмi легко переадресовувати ввід або вивiд.

Приклад:

#include<iostream.h>

#include<fstream.h>

const int max_line=80;

//

//переадресований вхiдний потiк

//

ifstream ifs;

int main(int argc,char *argv[] )

{

//якщо вказаний аргумент...

if (argc > 1)

{

//cпроба вiдкрити файл

ifs.open( argv[1] );

//якщо успiшна,переадресувати ввiд

if (ifs)

cin=ifs;

}

//запросити ввiд...

cout<<"Введiть рядок тексту:";

//прочитати данi iз стандартного вводу

char line[max_line];

cin.getline(line,sizeof(line) );

//показати введенi данi...

cout<<endl<<"Ви ввели :"<<line;

return o;

}

12.3 Розширення потоків для типів кориcтувача

В класах istream та ostream перевантажуються операції запису та зчитування з потоку для всіх стандартних типів даних. Таке перевантаження дозволяє використовувати однаковий синтаксис для вводу та виводу даних різних типів:

int i;

char c;

double d;

cout<<i<<c<<d;

Можливість послідовного застосування кількох операції забезпечується тим, що перегружені оператори вводу/виводу повертають посилання на об’єкт відповідного типу.

Бiблiотека iostream легко може бути розширеною для роботи з типами даних користувача. Для цього необхідно визначити двi функцiї iз слiдуючими заголовками:

// Читання даних з потоку

istream& operator >>(istream& is, iм'я_типу &varName);

// Запис даних в потiк

ostream& operator <<(ostream& os, iм'я_типу &varName);

Розглянемо такий приклад:

// io4type.cpp: i/o для типу, визначеного користувачем //

#include <iostream.h>

#include <assert.h>

struct NewType

{

int x;

int y;

};

// Читання:передбачений формат '(##,##)'

istream& operator >> (istream &is,NewType &nt)

{

char c;

cin >> c;

assert(c== '(' );

cin >> nt.x;

cin >> c;

assert(c== ',' );

cin >> nt.y;

cin >> c;

assert(c==')' );

return is;

}

//Запис:формат "(##,##)'

ostream & operator << (ostream &os, NewType &nt)

{

os << '('<< nt.x<< ','<< nt.y<< ')';

return os;

}

int main(void)

{

cout <<"Введiть два числа”

int ix;

cin >> ix;

int iy;

cin >> iy;

NewType nt;

nt.x=ix;

nt.y=iy;

cout << "Введено значення:"<< nt<< endl;

return 0;

}

12.4 Операції роботи з потоком як дружні

При використаннi класiв прийнято оголошувати операцiї видалення i помiщення друзями класу. Таке оголошення забезпечує для операцiї доступ до закритих полів даних при форматуваннi виводу.

Приклад:

#include <іostream.h>

class TPiece

{

// ...(закриті данi)

public;

//

// ...

//

friend istream& operator >> (istream&,TPiece&);

friend ostream& operator << (ostream&,const TPiece&);

};

//

// пiдтримка вихiдного потоку

//

ostream& operator <<(ostream &os,const TPiece &p)

{

// може використовувати для форматування

// закриті данi...

return os;

}

//

// i т.д.

//