Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Тонкости использования потоков ввода-выводаСодержание книги
Поиск на нашем сайте С помощью перегрузки операторов ввода и вывода в поток «и» вы можете заставить компилятор распознавать в операторах ввода-вывода один или несколько необходимых вам классов. В следующем разделе поясняется, как создать потоковые классы, и рассматриваются другие тонкости использования потоков. Форматирование вывода: В заголовочном файле IOSTREAM.H содержатся следующие объявления одного потока ввода и трех потоков вывода: extern istream_withassign_Cdecl cin; // Объект потока ввода extern ostream_withassign_Cdecl cout; // Объект потока вывода extern ostream_withassign_Cdecl cerr; // Объект потока вывода ошибок extern ostream_withassign_Cdecl clog; // Объект буферизованного потока вывода ошибок Классы istream_withassign и ostream_withassign в конечном счете выводятся из "прадедушки" классов потока ввода-вывода — ios. Вам не надо вникать во все детали реализации этих классов для того, чтобы использовать их в программах, однако, если вам интересно, в поставку Borland C++ входят полные и пространные файлы с исходными текстами реализации потоков ввода-вывода. Потоковые классы выполняют форматированный ввод-вывод со встроенной поддержкой обработки ошибок. Потоки ввода-вывода поддерживают базовые типы данных, подобные char, short, int, long, char* (например, символьная строка, завершающаяся нулем), float, double, long double и void* (отображается как значение-адрес). Имейте в виду, что cin, cout, cerr и clog — объекты классов. В соответствующих им классах определены перегруженные операторы потоков ввода и вывода, что позволяет использовать операторы ввода-вывода в поток следующим образом: cin >> v; // Прочитать v из стандартного ввода cout << v; // Записать v в стандартный вывод Как вы увидите в других примерах, операторы ввода-вывода можно использовать каскадом, как в следующем выражении: cout << "Balance == $" << balance < " (dollars)\n"; Для форматирования вывода вы можете установить один или несколько флагов в объекте потока ввода-вывода (см. объявление класса ios в заголовочном файле IOSTREAM.H). Следует использовать функции-члены flagsO, setfO и unsetfO для управления состоянием этих флагов. Например, для вывода беззнакового значения в шестнадцатеричной форме следует установить флаг hex в cout путем следующего обращения к функции-члену setfO класса ios: unsigned v = 12345; cout «"Before: " «v «'\n'; // Вывод по умолчанию (десятичный) cout.setf(cout.hex); // Модификация потока вывода cout «"After: " «v «'\n' // Шестнадцатеричный вывод Несмотря на то что это сработает, как показано дальше, существуют более простые способы форматирования потока вывода. Использование манипуляторов Подключение заголовочного файла IOMANIP.H (в котором при необходимости включается заголовочный файл IOSTREAM.H) делает возможным использование нескольких манипуляторов, полезных для создания форматированного вывода и чтения форматированного ввода. Например, вы можете использовать манипулятор hex для вывода значения в шестнадцатеричной форме: unsigned v = 12345; cout «"In hexadecimal v == " «hex «v «'\n'; cout «"In decimal v == " «dec «v «'\r\'\ В последней строке используется манипулятор dec для возвращения cout в состояние форматированного вывода в десятичной форме. Вы также можете манипулировать потоками ввода. Следующие операторы читают шестнадцатеричное значение и выводят его же в десятичной форме: cout «"Enter value in hex: "; cin» hex» v; cout «"Value in decimal == " «dec «v; В табл. 15.2 перечислены манипуляторы ввода-вывода, определенные в заголовочных файлах IOMANIP.H и IOSTREAM.H. Некоторые манипуляторы используются с параметрами. Например, манипулятор setbaseGnt n) форматирует значение в системе счисления с основанием п. (Если п — нуль, вывод по умолчанию становится десятичным, а ввод по умолчанию соответствует спецификациям ANSI С для символьного представления целочисленных значений.) Таблица 15.2. Манипуляторы потоков ввода-вывода
Манипуляторы-функции потоков вывода возвращают значения типа ostream&, другими словами, ссылки на объект ostream. Вы можете написать свои собственные манипуляторы, включив заголовочный файл IOSTREAM.H и определив функцию типа &ostream. Например, вы можете определить манипулятор звонка для потока вывода следующим образом: ostream& bell(ostream& os) { return os «"\a"; // '\a' - управляющий код звонка} Функция bell() имеет тип &ostream, и в ней объявлен параметр os типа ostream&. Это позволит использовать функцию в каскадном оперторе вывода в поток: cout «bell «"Ding!"; Можно также вызвать функцию-член потокового объекта для задания выравнивания. Например, для вывода значения целочисленной переменной v с выравниванием по правому краю в восьми позициях вы можете написать: cout.width(8); // Отобразить v в восьми позициях cout << v «'\n'; // Отобразить v с выравниванием по умолчанию cout «v «'\n';
Модификатор width недолговечен, он оказывает влияние только на следующее выводимое значение. Другие функции-члены используют функцию fill(charc), устанавливающую символ заполнения при выравнивании с помощью символьного параметра с, и precisionGnt n), устанавливающую точность вывода значений с Перегрузка оператора Вывода в поток Обычно потоки вывода могут поддерживать лишь базовые типы данных, подобные int, long, double, char* и т.д. С помощью перегрузки оператора вывода в поток <<, можно заставить выражения, в которых используются эти операторы, выводить объекты ваших собственных классов. В листинге 15.8 объявляется потоковый класс с именем TPoint и двумя целочисленными переменными х и у, запоминающими координаты, вероятно, на графическом дисплее. В программе перегружается оператор вывода в поток, так что можно использовать объекты класса TPoint в этих операторах, как показано в строках 20 и 23. Листинг 15.8. POINTOUT.CPP (классы и операторы вывода) «include <iostream.h> // объявляется потоковый класс //с именем TPoint class TPoint { private: int x, y; public: TPointO { x = у = 0; } TPoint(int xx, int yy) { x = xx; у = yy; } void PutX(int xx) { x = xx; } void PutY(int yy) { у = yy; } int GetX(void) { return x; } int GetY(void) { return y; } // перегружается оператор //вывода в поток friend ostream& operator<<(ostream& os, TPoint &p); } Main() { TPoint p; //// исп-ние парагруженного // оператора вывода в поток cout «p «‘\n’ p.PutX(100); p.PutY(200); cout «p «‘\n’ return 0; } // возвращает значения типа ostream&, //объявлены два параметра — os типа ostream& и ссылка р на объект класса TPoint. ostream& operator«(ostream& os, TPoint &p) { os «"x == " << p.x «", у == " «p.у; return os; } В строке 13 путем объявления дружественной функции-члена operator<<) перегружается оператор вывода в поток. Эта дружественная функция-член возвращает значения типа ostream&, и в ней объявлены два параметра — os типа ostream& и ссылка р на объект класса TPoint. Поскольку функция operator«() — друг класса TPoint, оператор в строке 29 имеет непосредственный доступ к данным-членам х и у объекта, на который ссылается ссылка р. Обратите внимание, что всю строку занимает один оператор вывода в поток, выводящий через ссылку os типа ostream значения двух данных-членов плюс две символьные строки. В конце концов, функция возвращает ссылку os. Запуск программы на выполнение приведет к следующим результатам: х == 0, у == 0 х == 100, у == 200 Поскольку функция operator<<() возвращает ссылку на ostream, можно выводить несколько объектов в одном операторе вывода в поток. Например, если p1, р2 и рЗ — объекты класса TPoint, можно отобразить их значения следующим образом: out «р1 «"; " «р2 «"; " «рЗ; эти операторы выполняются путем обращения к нескольким функциям, реализующим перегрузку оператора вывода в поток. Предыдущая строка выполняется подобно написанной следующим образом: ((((cout «р1) «"; ") «р2) «"; ") «рЗ;
|
||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-08-01; просмотров: 354; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.55.223 (0.008 с.) |