|
Программирование >> Структурное программирование
Замечание по технике программирования 11.3 Новые возможности ввода-вывода данных, тип которых определен пользователем, добавляются в С++ без модификации объявлений или элементов-данных закрытого типа в классе ostream и в классе istream. Это способавует расширяемости - наиболее привлекательной черте языка С++. 11.10. Связывание выходного потока с входным Интерактивные приложения обычно включают класс istream для ввода и класс ostream для вывода. Когда на экране появляется приглашение на ввод, пользователь вводит соответствующие данные. Очевидно, что приглашение на ввод должно появляться до осуществления операции ввода. При буферизации выходных данных их вывод на экран осуществляется только когда буфер окажется полным, когда вывод явным образом сбрасываются программой или автоматически в конце программы. В языке С++ имеется функция-элемент tie для синхронизации (связывания) выполнения операций над потоками istream и ostream, которая гарантирует, что вывод появится раньше последующего ввода. Вызов cin.tie(Scout); связывает cout (класса ostream) и cin (класса istream). В действительности этот вызов является лишним, поскольку С++ автоматически выполняет эту операцию при создании стандартной пользовательской среды ввода-вывода. Пользователю следует, однако, явным образом связывать другие пары потоков классов ostream и istream. Для того, чтобы развязать входной поток inputStream от выходного, используйте следующий вызов : inputStream.tie(0) ; Резюме Каждая операция ввода-вывода осуществляется способом, чувствительным к типу данных. В языке С++ производится ввод-вывод потоков байтов. Поток - это просто последовательность байтов. Функция operator отображает части телефонного номера в виде строк, поскольку эти части хранятся в формате строк (вспомните, что функция-элемент getline класса istream сохраняет в памяти нулевой символ после завершения ввода). Перегруженные функции operator объявляются в классе PhoneNumber как дружественные функции. Перегруженные операции ввода-вывода должны быть объявлены как дружественные, если им необходим доступ к каким-то элементам, помимо открытых. Друзья класса имеют доступ к закрытым элементам. Механизм ввода-вывода заключается в пересылке байтов данных от устройств в оперативную память и обратно эффективным и надежным способом. Язык С-Ы- предоставляет возможности для ввода-вывода как на низком , так и на высоком уровнях. Ввод-вывод на низком уровне сводится к тому, что некоторое число байтов данных просто следует переслать от устройства в память или из памяти в устройство. Ввод-вывод на высоком уровне заключается в том, что байты группируются в такие значащие элементы данных, как, например, целые числа, числа с пла-ваюп]1ей запятой, символы, строки, а также данные типов, определенных пользователем. Язык С++ предоставляет возможности для неформатированного и форматированного ввода-вывода. Неформатированный ввод-вывод позволяет осуществлять пересылку файлов с высокой скоростью, но он обрабатывает только сырые данные, которыми сложно пользоваться. Форматированный ввод-вывод обрабатывает структурированные данные, но требует дополнительного времени на их обработку, что может быть недостатком при передаче больших объемов данных. Большинство программ на С-Ы- включает заголовочный файл <ios-tream.h>, который содержит основную информация, необходимую для всех операций ввода-вывода. Заголовочный файл <iomanip.h> содержит информацию, полезную для обработки форматированного ввода-вывода при помощи параметризованных манипуляторов потока. Заголовочный файл <fstream.h> содержит информацию, необходимую для проведения операций с файлами. Заголовочный файл <strstream.h> содержит необходимую информацию для выполнения форматированного ввода-вывода в память. Заголовочный файл <st(iiostream.h> включает важные сведения для программ, использующих для выполнения операций ввода-вывода сочетание стилей языков С и C-f-f. Класс istream поддерживает операции ввода потоков. Класс ostream поддерживает операции вывода потоков. Класс iostream поддерживает как операции ввода, так и операции вывода потоков. Классы istream и ostream являются производными классами прямого наследования базового класса ios. Класс iostream является производным классом множественного наследования классов istream и ostream. Операция сдвига влево ( ) перегружена для обозначения вывода в поток и называется операцией поместить в поток. Операция сдвига вправо ( ) перегружена для обозначения ввода потока и называется операцией взять из потока. Объект стандартного потока ввода cin класса istream привязан к стандартному устройству ввода, обычно к клавиатуре. Объект стандартного потока вывода cout класса ostream привязан к стандартному устройству вывода, обычно к экрану дисплея. Объект cerr класса ostream привязан к стандартному устройству вывода сообщений об) ошибках. Выводимые потоки данных для объекта cerr являются небуферизованными. Это означает, что каждая операция поместить в cerr приводит к мгновенному появлению выводимых сообщений об ошибках. Манипулятор потока endl вызывает переход на новую строку и кроме того приводит к сбросу буфера вывода. Компилятор С++ автоматически определяет типы данных при вводе и выводе. По умолчанию адреса отображаются в шестнадцатеричном формате. Для печати адреса следует привести тип указателя к типу void *. Функция-элемент put выводит одиночный символ. Вызовы функции put могут быть сцепленными. Ввод потока осуществляется операцией взять из потока . Эта операция автоматически игнорирует символы разделители во входном потоке. Операция возвращает false, если в потоке встретился признак конца файла. Операция взять из потока приводит к установке бита failbit при вводе данных неправильного типа и к установке бита badbit при неуспешном завершении операции. Можно последовательно вводить данные, используя операцию взять из потока в условном операторе заголовка цикла while. Операция взять из потока возвращает false, когда встречается признак конца файла. Функция-элемент get без аргументов вводит одиночный символ из указанного потока и возвращает этот символ. Этот вариант функции get возвращает EOF, когда в потоке встречается признак конца файла. Функции-элемента get с символьным аргументом типа char вводит один символ. Функция возвращает EOF, когда встречается признак конца файла; в остальных случаях возвращается ссылка на тот объект класса istream, для которого вызывалась функция-элемент get. Функции-элемента get с тремя аргументами: символьным массивом, максимальное число символов и ограничителем (по умолчанию значение \п), читает символы из входного потока до тех пор, пока не достигается число символов, на 1 меньше указанного максимального числа, или пока не прочтется ограничитель. Введенная строка заканчивается нулевым символом. Ограничитель в символьный массив не помещается, а остается во входном потоке. Функция-элемент getline действует подобно варианту функции-элемента get с тремя аргументами. Функция getline удаляет символ ограничитель из входного потока и не сохраняет его в строке. Функция-элемент ignore пропускает заданное число символов (по умолчанию один символ) во входном потоке; она завершает свою работу
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |