Программирование >>  Структурное программирование 

1 ... 209 210 211 [ 212 ] 213 214 215 ... 342


11.1. Введение

Стандартные библиотеки в языке С++ имеют расширенный набор средств ввода-вывода. В этой главе рассматривается комплекс средств, достаточный для выполнения большинства общепринятых операций ввода-вывода, и приводится обзор остальных возможностей. Некоторый средства, приведенные здесь, были рассмотрены в книге раньше, но эта глава позволяет провести более полное и упорядоченное рассмотрение возможностей ввода-вывода в С++.

Многие из описанных здесь средств ввода-вывода являются объектно-ориентированными. Читателю будет интересно увидеть, как они реализуются. Стиль ввода-вывода, приведенный в этой главе, позволяет использовать и другие свойства языка С++, такие, как ссылки, перегрузка функций и перегрузка операций.

Как мы увидим позже, в языке С++ предусмотрены средства сохранения типов данных при вводе-выводе. Каждая операция ввода-вывода осуществляется способом, чувствительным к типу данных. Если для какого-то типа данных должным образом была определена функция ввода-вывода, то именно она автоматически вызывается для обработки этого типа данных. Если нет соответствия между типом реальных данных и функцией обработки этого типа данных, то компилятор обнаружит ошибку. Таким образом, несоответствующие данные не могут проникнуть в систему (как может случиться в С, в котором есть лазейки, приводящие к возникновению неуловимых и странных ошибок).

Пользователи могут задавать ввод-вывод типов, определяемых пользователем, так же, как и стандартных типов. Такая расширяемость является самым ценным свойством языка С++.

Хороший стиль программирования 11.1

Используйте исключительно возможности языка С++ для организации ввода-вывода в программах, написанных на С++, хотя в этих программах доступен и стиль программирования языка С.

Замечание по технике программирования 11.1

Стиль программирования на языке С++ - это аиль, в котором предусмотрены средства сохранения типов данных

Замечание по технике программирования 11.2

Язык С++ предоставляет возможность для стандартной обработки ввода-вывода встроенных типов данных и типов данных, определенных пользователем. Это свойство облегчает разработку программного обеспечения вообще и повторное его использование в частности.

Резюме Терминология Типичные ошибки программирования Хороший стиль программирования Советы по повышению эффективности Замечания по технике программирования Упражнения для самопроверки Ответы на упражнения для самопроверки Упражнения



11.2. Потоки

в языке С++ производится ввод-вывод потоков байтов. Поток - это просто последовательность байтов. В операциях ввода байты пересылаются от устройства (например, от клавиатуры, дисковода или соединения сети) в оперативную память. При выводе байты пересылаются из оперативной памяти на устройства (например, на экран дисплея, принтер, дисковод или в соединение сети).

Приложение связывает значение элемента данных с байтами данных. Байты данных могут представляться в виде символов в коде АЗСП, в виде внутреннего формата сырых данных, в виде графического изображения, от-цифрованной речи, цифрового видеоизображения или в виде любой другой информации, которая может потребоваться приложению.

Механизм ввода-вывода заключается в пересылке байтов данных от устройств в оперативную память и обратно эффективным и надежным способом. Такая пересылка часто включает механические перемещения, например, вращение диска и ленты или нажатие клавиш клавиатуры. Время, затрачиваемое на такие перемещения, обычно значительно превышает время, в течение которого процессор обрабатывает данные. Таким образом, операции ввода-вывода требуют тщательного планирования для достижении максимальной эффективности. Вопросы, подобные этому, глубоко рассматриваются в руководствах по операционным системам (De90).

Язык С++ предоставляет возможности для ввода-вывода как на низком , так и на высоком уровнях. Ввод-вывод на низком уровне (т.е. неформатированный ввод-вывод) обычно сводится к тому, что некоторое число байтов данных просто следует переслать от устройства в память или из памяти в устройство. При такой пересылке каждый байт является самостоятельным элементом данных. Передача на низком уровне позволяет осуществлять пересылку больших по объему потоков ввода-вывода с высокой скоростью, но такая передача обычно неудобна для программиста.

Программисты предпочитают иметь дело с представлением операций ввода-вывода на высоком уровне, т.е. с форматированным вводом-выводом, при котором байты группируются в такие значащие элементы данных, как, например, целые числа, числа с плавающей запятой, символы, строки, а также данные типов, определенных пользователем. Такие ориентированные на типы возможности более удобны для большинства операций ввода-вывода, кроме обработки файлов очень большого объема.

Совет по повышению эффективности 11.1

Используйте неформатированный ввод-вывод для достижения максимальной эффективности при обработке файлов большого объема.

11.2.1. Заголовочные файлы библиотеки iostream

Библиотека потоков iostream предоставляет сотни возможностей для выполнения операций ввода-вывода. Интерфейс библиотеки разбит на несколько заголовочных файлов.

Большая часть программ на языке С++ включает заголовочный файл <ios-tream.h>, который содержит основные сведения, необходимые для всех опера-



ций с потокам ввода-вывода. Заголовочный файл <iostreain.h> включает объекты cin, cout, сегг и clog, которые соответствуют стандартному потоку ввода, стандартному потоку вывода, небуферизованному и буферизованному стандартным потокам вывода сообщений об ошибках. Предусмотрены возможности как для форматированного ввода-вывода, так и для неформатированного.

Заголовочный файл <iomanip.h> содержит информацию, полезную для обработки форматированного ввода-вывода при помощи так называемых параметризованных манипуляторов потока.

Заголовочный файл <fstream.h> содержит важную информацию для проведения операций с файлами, обработка которых осуществляется под контролем пользователя.

Заголовочный файл <strstream.h> содержит информацию, важную для выполнения форматированного ввода-вывода в память. Это похоже на обработку файлов, но операции ввода-вывода проводятся с символьными массивами, а не с файлами.

Заголовочный файл <stdiostream.h> включает нужные сведения для программ, использующих для выполнения операций ввода-вывода сочетание стилей языков С и C-f+. При создании новых программах следует избегать для операций ввода-вывода стиля языка С. Но для программистов, которым необходимо модифицировать уже существующие программы, написанные на С, эта предоставляемая в C+-I- возможность сочетания двух стилей окажется полезной.

Программы на С++ могут содержать также другие библиотеки, связанные с вводом-выводом, в которых предусмотрены, например, такие специфические для системы возможности, как управление специализированными устройствами для ввода-вывода аудио- и видеоданных.

11.2.2. Классы и объекты потоков ввода-вывода

Библиотека iostream содержит много классов для обработки широкого спектра операций ввода-вывода. Класс istream поддерживает операции по вводу потоков. Класс ostream поддерживает операции по выводу потоков. Класс iostream поддерживает оба типа операций: и ввод и вывод потоков.

Класс istream и класс ostream являются производными классами прямого наследования базового класса ios. Класс iostream является производным классом множественного наследования классов istream и ostream. Структура связей наследования представлена на рис. 11.1.

Перегрузка операций обеспечивает удобную запись операций ввода-вывода. Операция сдвига влево ( ) перегружена для обозначения вывода в поток и называется операцией поместить в поток. Операция сдвига вправо ( ) перегружена для обозначения ввода потока и называется операцией взять из потока. Эти операции применяются к объектам стандартных потоков cin, cout, сегг и clog и обычно используются также с объектами потоков, тип которых определен пользователем.

Объект стандартного потока ввода cin класса istream, как принято говорить, привязан (или присоединен ) к стандартному устройству ввода, обычно к клавиатуре. Операция взять из потока, показанная в приведенном ниже операторе, означает, что значение целой переменной grade (если полагать, что переменная grade объявлена как целая типа int) должно быть введено из объекта cin в память:

cin >> grade;



1 ... 209 210 211 [ 212 ] 213 214 215 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика