Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Библиотека ввода-вывода iostream.h




Предопределенные объекты и потоки. В стандартной библиотеке ввода/вывода стандартного 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):

ios базовый потоковый класс
streambuf буферизация потоков
istream потоки ввода
ostream потоки вывода
iostream двунаправленные потоки
iostream_withassign поток с переопределенной операцией присваивания
istrstream строковые потоки ввода
ostrstream строковые потоки вывода
strstream двунаправленные строковые потоки
ifstream файловые потоки ввода
ofstream файловые потоки вывода
fstream двунаправленные файловые потоки

Стандартные потоки (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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...