- •Обзорные лекции по курсу
- •1.Потоки
- •1.1. Заголовочные файлы библиотеки потоков iostream
- •1.2. Классы и объекты потоков ввода-вывода
- •2.Вывод потоков
- •Int main()
- •3. Ввод потоков
- •Int X, у;
- •Int с;
- •Сохранение типов данных при вводе-выводе
- •4. Неформатированный ввод-вывод с использованием read, gcount и write
- •5. Манипуляторы потоков
- •Манипуляторы, определяемые пользователем
- •Упражнения для самопроверки
Манипуляторы, определяемые пользователем
Пользователи могут создавать собственные манипуляторы потоков. Нижеприведенная программа показывает создание и использование новых манипуляторов потоков bell, ret (возврат каретки), tab и endLine. Пользователи могут также создавать собственные параметризованные манипуляторы потоков; обратитесь за справкой, как это сделать, к вашему руководству по системе.
// Создание и проверка непараметризованных манипуляторов
// потока, определенных пользователем.
#include <iostream.h>
//Манипулятор bell (использует escape-последовательность \a)
ostream& bell (ostream& output)
{
return output « ' \a' ;
}
//Манипулятор ret (использующий управляющую последовательность \r)
ostream& ret(ostream& output)
{
return output « ' \r' ; }
//Манипулятор tab (использующий управляющую последовательность \t)
ostream& tab(ostream& output)
{
return output « '\t'; }
//Манипулятор endLine (использующий управляющую
// последовательность \n)
//и функция-элемент flush
ostream& endLine(ostream& output)
{
return output « '\n' « flush;
}
int main ()
cout « "Проверка манипулятора tab:" « endLine
« 'a' « tab « 'b' « tab « 'c' « endLine « "Проверка манипуляторов ret и bell:" « endLine « " .......... " ;
for (int i = 1; i <= 100; i++)
cout « bell;
cout « ret « " ----- " « endLine;
return 0;
}
РЕЗЮМЕ
Каждая операция ввода-вывода осуществляется способом, чувствительным к типу данных. В языке С++ производится ввод-вывод потоков байтов. Поток — это просто последовательность байтов. Механизм ввода-вывода заключается в пересылке байтов данных от устройств в оперативную память и обратно эффективным и надежным способом.
Язык С++ предоставляет возможности для ввода-выводакак на «низком», так и на «высоком» уровнях. Ввод-вывод на низком уровне сводится к тому, что некоторое число байтов данных просто следует переслать от устройства в память или из памяти в устройство. Ввод-вывод на высоком уровне заключается в том, что байты группируются в такие значащие элементы данных, как, например, целые числа, числа с плавающей запятой, символы, строки, а также данные типов, определенных пользователем.
Язык С++ предоставляет возможности для неформатированного и форматированного ввода-вывода. Неформатированный ввод-вывод позволяет осуществлять пересылку файлов с высокой скоростью, но он обрабатывает только сырые данные, которыми сложно пользоваться. Форматированный ввод-вывод обрабатывает структурированные данные, но требует дополнительного времени на их обработку, что может быть недостатком при передаче больших объемов данных. Большинство программ на С++ включает заголовочный файл <iostream.h>, который содержит основную информация, необходимую для всех операций ввода-вывода.
Заголовочный файл <iomanip.h> содержит информацию, полезную для обработки форматированного ввода-вывода при помощи параметризованных манипуляторов потока. Заголовочный файл <fstream.h> содержит информацию, необходимую для проведения операций с файлами. Заголовочный файл <strstream.h> содержит необходимую информацию для выполнения форматированного ввода-вывода в память. Заголовочный файл <stdiostream.h> включает важные сведения для программ, использующих для выполнения операций ввода-вывода со четание стилей языков С и С++.
Класс istream поддерживает операции ввода потоков.
Класс ostream поддерживает операции вывода потоков.
Класс iostream поддерживает как операции ввода, так и операции вы вода потоков.
Классы istream и ostream являются производными классами прямого наследования базового класса ios.
Класс iostream является производным классом множественного насле дования классов istream и ostream.
Операция сдвига влево («) перегружена для обозначения вывода в поток и называется операцией поместить в поток.
Операция сдвига вправо (») перегружена для обозначения ввода по тока и называется операцией взять из потока.
Объект стандартного потока ввода cin класса istream привязан к стан дартному устройству ввода, обычно к клавиатуре.
Объект стандартного потока вывода cout класса ostream привязан к стандартному устройству вывода, обычно к экрану дисплея.Объект cerr класса ostream привязан к стандартному устройству вывода сообщений o6 ошибках. Выводимые потоки данных для объекта cerr являются небуферизованными. Это означает, что каждая операция поместить в cerr приводит к мгновенному появлению выводимых сообщений об ошибках.
Манипулятор потока endl вызывает переход на новую строку и кроме того приводит к сбросу буфера вывода.
Компилятор С++ автоматически определяет типы данных при вводе и выводе.
По умолчанию адреса отображаются в шестнадцатеричном формате. Для печати адреса следует привести тип указателя к типу void *.
Функция-элемент put выводит одиночный символ. Вызовы функции put могут быть сцепленными.
Ввод потока осуществляется операцией взять из потока ». Эта операция автоматически игнорирует символы разделители во входном потоке. Операция » возвращает false, если в потоке встретился признак конца файла. Операция взять из потока приводит к установке бита failbit при вводе данных неправильного типа и к установке бита badbit при неуспешном завершении операции. Можно последовательно вводить данные, используя операцию взять из потока в условном операторе заголовка цикла while. Операция взять из потока возвращает false, когда встречается признак конца файла.
Функция-элемент get без аргументов вводит одиночный символ из указанного потока и возвращает этот символ. Этот вариант функции get возвращает EOF, когда в потоке встречается признак конца файла. Функции-элемента get с символьным аргументом типа char вводит один символ. Функция возвращает EOF, когда встречается признак конца файла; в остальных случаях возвращается ссылка на тот объект класса istream, для которого вызывалась функция-элемент get.
Функции-элемента get с тремя аргументами: символьным массивом, максимальное число символов и ограничителем (по умолчанию значение '\n')> читает символы из входного потока до тех пор, пока не достигается число символов, на 1 меньше указанного максимального числа, или пока не прочтется ограничитель. Введенная строка заканчивается нулевым символом. Ограничитель в символьный массив непомещается, а остается во входном потоке.
Функция-элемент getline действует подобно варианту функции-элемента get с тремя аргументами. Функция getline удаляет символ ограничитель из входного потока и не сохраняет его в строке. Функция-элемент ignore пропускает заданное число символов (по умолчанию один символ) во входном потоке; она завершает свою работу при обнаружении заданного ограничителя (по умолчанию символом ограничителем является EOF).Функция-элемент putback возвращает обратно в этот поток предыдущий символ, полученный из входного потока с помощью функции get. Функция-элемент peek возвращает очередной символ из входного потока, но не удаляет его из потока.
Язык С++обеспечивает сохранение типов данных при вводе-выводе. Если операциями « и » обрабатываются непредусмотренные данные, то устанавливаются различные флаги ошибок, с помощью которых пользователь может определить, были ли операции ввода-вывода успешными, или нет.
Неформатированный ввод-вывод выполняется с помощью функций-элементов read и write. Каждая из них вводит некоторое число байтов в символьный массив в памяти или выводит их из него. Эти байты не подвергаются какому-либо форматированию и вводятся или выводятся как сырые байты. Функция-элемент gcount сообщает о количестве символов, прочитан ных последней операцией read. Функция-элемент read вводит в символьный массив указанное число символов. Если считывается меньшее количество символов, то уста навливается бит failbit.
Для изменения основания интерпретации целых чисел в потоке используйте манипулятор hex, чтобы установить шестнадцатеричный формат представления элементов данных (с основанием 16), или манипулятор oct, чтобы установить восьмеричный формат представления данных (с основанием 8). Используйте манипулятор dec для возврата к основанию потока 10. Основание потока остается установленным до тех пор, пока оно не будет изменено явным образом новой установкой.Основание потока может быть также изменено с помощью манипуля тора потока setbase, который принимает один целый параметр со значениями 10, 8 или 16, задающими соответствующие основания системы счисления.
Точностью печатаемых чисел с плавающей запятой можно управлять, используя манипулятор потока precision или функцию-элемент setprecision. Вызов любой из этих установок точности действует для всех последующих операций вывода до тех пор, пока не будет произведена следующая установка точности. Функция-элемент precision не имеет никаких аргументов и возвращает текущее значение точности. Точность 0 устанавливает точность по умолчанию, равную 6. При использовании параметризованных манипуляторов потоков необ ходимо в программу включать заголовочный файл <iomanip.h>.
Функция-элемент width устанавливает ширину поля и возвращаетпредыдущую ширину поля. Если обрабатываемые значения имеют меньше символов, чем заданная ширина поля, то для заполнения лишних позиций используются заполняющие символы. Установка ширины поля влияет только на следующую операцию поместить или взять; затем ширина поля устанавливается неявным образом на 0, т.е. поля представления выходных значений будут просто такой ширины, которая необходима. Если число символов в обрабатываемом значении больше, чем заданная ширина поля, то число будет напечатано полностью. Функция width, не имеющая аргументов, возвращает текущую установку. Для установки ширины поля может быть также использован манипулятор потока setw. При вводе манипулятор потока setw устанавливает максимальный размерстроки;если вводится строка, превышающая заданный размер, то вводимая строка разбивается на фрагменты, не превышающие заданного размера.
Литература
Глушаков С.В. , Коваль А.В., Черепнин С.А. Язык программирования С++, учебный курс: Харьков: «Фолио Аст», 2001-500 с.
Харви Дейтел, Пол Дейтел, Как программировать на С++: Третье издание. Пер. с англ.-М.: ЗАО «Издательство БИНОМ», 2001 г. -1152 с.: ил.
Баженова И.Ю. VisualC++6.0(VISUALSTUDIO98).Уроки программирования.-М.: Диалог-МИФИ, 2001-416 с.