Библиотека ввода-вывода iostream.h
⇐ ПредыдущаяСтр 3 из 3 Предопределенные объекты и потоки. В стандартной библиотеке ввода/вывода стандартного C (заголовочный файл библиотеки – <stdio.h>) имеются внешние переменные-указатели на дескрипторы файлов стандартных устройств ввода-вывода. extern FILE *stdin, *stdout, *stderr, *stdaux, *stdprn; стандартный ввод стандартный вывод регистрация ошибок дополнительное устройство устройство печати Эти файлы открываются библиотекой автоматически перед выполнением функции main и по умолчанию назначаются на терминал (stdin – клавиатура, stdout, stderr – экран), последовательный порт (stdaux) и принтер (stdprn). stdin и stdout могут быть переназначены в командой строке запуска программы на любые другие файлы test.exe <a.dat >c:\xxx\b.dat поток stdout поток stdin В C++ существуют классы потоков ввода-вывода (stream.h), которые являются объектно-ориентированным эквивалентом стандартной библиотеки ввода-вывода (stdio.h):
Стандартные потоки (istream, ostream, iostream) служат для работы с терминалом. Строковые потоки (istrstream, ostrstream, strstream) служат для ввода-вывода из строковых буферов, размещенных в памяти. Файловые потоки (ifstream, ofstream, fstream) служат для работы с файлами. Следующие объекты-потоки (мы с ними уже сталкивались) заранее определены и открыты в программе перед вызовом функции main: extern istream cin; // Стандартный поток ввода с клавиатуры
extern ostream cout; // Стандартный поток вывода на экран extern ostream cerr; // Стандартный буферизованный поток вывода сообщений об // ошибках (экран) Форматирование. Флаги форматирования. Пока << применялась только для неформатированного вывода, и в реальных программах она именно для этого главным образом и применяется. В то же время << легко справляется с тремя стандартными типами данных: char, int, float. В результате переопределения операция помещения в поток определяет тип посланных данных, и сама выбирает подходящий формат. То же самое происходит и с операцией извлечения из потока >>, которая вводит данные. Помимо этого существует также несколько форматирующих функций, создающих представление своего параметра в виде строки, которая используется для вывода. Их второй (необязательный) параметр указывает, сколько символьных позиций должно использоваться. char* oct(long, int=0); // восьмеричное представление char* dec(long, int=0); // десятичное представление char* hex(long, int=0); // шестнадцатеричное представление char* chr(int, int=0); // символ char* str(char*, int=0); // строка Если не задано поле нулевой длины, то будет производиться усечение или дополнение; иначе будет использоваться столько символов (ровно), сколько нужно. Например: cout << "dec(" << x << ") = oct(" << oct(x,6) << ") = hex(" << hex(x,4) << ")"; Если x==15, то в результате получится: dec(15) = oct(17) = hex(f); Можно также использовать строку в общем формате: char* form(char* format...); cout<<form() эквивалентно применению стандартной функции вывода языка C printf(). form() возвращает строку, получаемую в результате преобразования и форматирования ее параметров, которые стоят после первого управляющего параметра – строки формата format. Строка формата состоит из объектов двух типов: обычных символов, которые просто копируются в поток вывода, и спецификаций преобразования, каждая из которых влечет преобразование и печать следующего из параметров. Каждая спецификация преобразования начинается с символа % (процент). Например:
cout<<form("Введено %d элементов", size); Здесь %d указывает, что size должно рассматриваться как int и печататься в виде соответствующей последовательности десятичных цифр. Описание формата преобразования функции form() схоже c форматом printf() и мы подробно на нем останавливаться не будем. При использовании form()не выполняется проверка типа. Ввод-вывод абстрактных типов данных. Мы уже говорили, что операторы >> и << можно перегружать, причем, вы сами можете создать свои операторы извлечения и внесения для создаваемых вами типов. В общем виде, операция внесения имеет следующую форму ostream& operator << (ostream& stream, имя_класса& obj) { stream <<... // вывод элементов объекта obj в поток stream return stream; } Аналогичным образом может быть определена функция извлечения istream& operator << (istream& stream, имя_класса& obj) { stream >>... // ввод элементов объекта obj из потока stream return stream; } Функции внесения и извлечения возвращают ссылку на соответствующие объекты, являющиеся, соответственно, потоками вывода или ввода. Первые аргументы тоже должны быть ссылкой на поток. Второй параметр – ссылка на объект, выводящий или получающий информацию. Эти функции не могут быть методами класса, для работы с которым они создаются, такие функции могут быть только дружественными по отношению к этому классу.
[1] Под термином пользователь мы будем понимать не того человека, который работает с уже готовой, откомпилированной программой, а прикладного программиста, использующего наш класс для решения своей задачи. Соответственно, создавая класс, мы тем самым выступаем в роли системного программиста. Объекты, полученные из описания класса, называют экземплярами этого класса.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|