|
Программирование >> Структурное программирование
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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |