Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
226 Кб
Скачать
☆

27. Потоки ввода-вывода.

Ostream – это механизм для преобразования значений различного типа в последовательность символов. Обычно эти символы затем выводятся при помощи низкоуровневых операций вывода. Есть много видов символов , которые можно охарактеризовать при помощи свойств символов char_traits. Ostream является специализацией для конкретных видов символов универсального шаблона basic_ostream. Этот шаблон и ассоциированные с ним поерации вывода определены в пространстве имен std и представлены загловочным файлом <iostream> . В <iostream> объявлено несколько стандартных потоков вывода: cout, cerr, clog, wcount, wcerr, wclog. По аналогии с basic_ostream basic_istream определен в <istream>. В istream вводятся два стандвртных потока cin и wcin.

28. Иерархия классов ввода-вывода. Основные уровни иерархии. Классы потоков.

Базовый класс basic_ios представлен в <ios>. Он котролирует форматирование, национальные особенности, и обращение к буферам. Класс ios_base содержит информацию и операции, не зависящие от типа используемых символов – например, точность для вывода числа с плавающей точкой. В <iostream> объявлено несколько стандартных потоков вывода: cout, cerr, clog, wcount, wcerr, wclog. По аналогии с basic_ostream basic_istream определен в <istream>. В istream вводятся два стандвртных потока cin и wcin.

29. Стандартные классы, объекты и механизмы консольного ввода/вывода.

Операции << и >> для потоков

В классах iostream операции >> и << определены для всех встроенных типов языка Си++ и для строк (тип char*). Если мы хотим использовать такую же запись для ввода и вывода других классов, определенных в программе, для них нужно определить эти операции.

class String

{

public:

friend ostream& operator<<(ostream& os,

const String& s);

friend istream& operator>>(istream& is,

String& s);

private:

char* str;

int length;

};

ostream& operator<<(ostream& os,

const String& s)

{

os << s.str;

return os;

}

istream& operator>>(istream& is,

String& s)

{

// предполагается, что строк длиной более

// 1024 байтов не будет

char tmp[1024];

is << tmp;

if (s.str != 0) {

delete [] s.str;

}

size_t length = strlen(tmp);

s.str = new (std::nothrow) char[length + 1];

if (s.str == 0) {

// обработка ошибок

return is;

}

strcpy(s.str, tmp);

return is;

}

Как показано в примере класса String, операция <<, во-первых, является не методом класса String, а отдельной функцией. Она и не может быть методом класса String, поскольку ее правый операнд – объект класса ostream. С точки зрения записи, она могла бы быть методом класса ostream, но тогда с добавлением нового класса приходилось бы модифицировать класс ostream, что невозможно – каждый бы модифицировал стандартные классы, поставляемые вместе с компилятором. Когда же операция << реализована как отдельная функция, достаточно в каждом новом классе определить ее, и можно использовать запись:

String x;

. . .

cout << "this is a string: " << x;

Во-вторых, операция << возвращает в качестве результата ссылку на поток вывода. Это позволяет использовать ее в выражениях типа приведенного выше, соединяющих несколько операций вывода в одно выражение.