Г. Шилдт - Полный справочник по C++ (1109478), страница 35
Текст из файла (страница 35)
выволяшая символ на экран. Функция дееоьет<) ожидает нажатия клавиши и везера~лает ес значение, которое автоматически выводится на экран. Функция рпеоьае(> выводит символ па экран в точку, определспну)о тскушим положением курсора. Прототипы функций дееоЬек() и риеоьекО выглядят так. 1пс десобех(тохй)г гпс росопаг(тпс с); Как видим, функция дееоЬат<) возврашаст целое число. В его младшем байте содержится код символа, соответствующего нажатои клавише.
(Старший байт обычно содержит пулевое значение.) Это позволяет присвоить полученное целочисленное значение какой-нибудь символьной переменной. Если прн вводе произошла ошибка, функция десоЬех() возврашаст константу КОК. Несмотря на то что функция риеоьае<> по определению должна получать целочисленный аргумент, ей можно передавать только символьные з((ачения. На экран выводится лишь младший байт аргумента. Функция риеоьае( > возврашает либо символ, выведенный ею на экран, либо константу кол, если произошла ошибка. (констагпа вот определена в заголовочном файле вей1о.ь и обычно равна — )). Применение функций дееоцат() и рисоЬакО иллюстрируется слсДуюшсй програ)ямой. Она вводит символы с клавиатуры и выводит их в противоположном регистре, т.е.
прописные буквы становятся строчными, и наоборот. Чтобы прекратить выполнение программы. достаточно ввести точку. «мво1ийе <всйдо.)» атос)ойе косуре.)» 1пс гле1п(уохй) ( обет сЬ; рг1псх("введите текст (ллв выхода введите точку).1п"): йо ( оЬ = дегоцат(); 18(дв1оиет(оп)) ог = еооррет(о)й е1ве оь = Со1онег(ой); россбат(оЬ); ) ьй(1е (об != '.'); теептп О; ) Глава 8. Ввод-вывод на консоль Проблемы, связанные с функцией де1сйатЦ Функция деес)так О может породить несколько проблем. Обычно эта функция помещает входные данные в буфер, пока нс будет нажата клавиша <Внтпн>.
Такои способ называется буферизованным вводом Ойзе-Ьпу/егер шрп(). Для того чтобы данные, которые вы ввели, действительно были переданы программе, следует нажать клавишу «Внтпд>. Кроме того, при каждом вызове функция деес)зак() вводит символы по одному, последовательно размещая их в очереди. Если программа использует интерактивный диалог, такое торможение становится раздражающим фактором. Несмотря па то что стандарт языка С/Сч ь позволяет сделать функцию деес)гак() интерактивной, эта возможносп используется редко Итак, если вдруг обнаружится, что приведенная выше программа работает не так, как ожидалось, ны будете знать причину.
Альтернативы функции де1сйаго Функция деесьак(), реализованная вашим компилятором, может пе соответствовать требованиям интерактивной среды. В этом случае можно использовать другие функции. позволяюшие считывать символы с клавиатуры. В стандарте языка С++ не предусмотрено пи одной функции, гараптируюшей интсрактивныи ввод, но па практике этот недостаток восполняется компиляторами. Наиболес известными альтернативами являются функции деесЫ) и деес)зе(). Их прототипы выглядят так. ьпс дессп(чсзб); ппе пес<бе(чей); Большинство компиляторов размс1пают прототипы этих функций в заголовочном файле соа1с.)ь В некоторых компиляторах перед именами этих функций ставится знак подчеркивания. Например, в компиляторе Мьегозой Ъьпа! С++ эти функции называются деес)з() н деес)за О соответственно, После нажатия клавиши функция деес)з() немедленно возврашаст результат, введенный символ па экране пе отображается.
Функция деес)за О аналогична функции деесЫ ), за одним исключением: введенный символ отображается на экране. В интерактивных программах вместо функции деес)зак() чаще всего используются функции деес)зО и деесцеоп Однако, если компилятор не поддерживает эти функции, либо функция деес)гакО, реализованная им, полностью соответствует требованиям интерактивной среды, следует применять именно ее.
Перепишем предыдущую программу, заменяя функцию деес)так() функцией дессер(). Зтпс1пбе <веб(с.):> 3 ьпс1пбе < сон(о. П> й г пс1пбе <сеуре, й> (пе аа1п(воза) ( спаг сум рейесом("Введите текст (для выхода введите точку). 1п"); до ( с)з = дессЬ(); Часть!. Основы языка С++: подмножество С нять в коммерческих приложениях.
Ес альтернативой является функция кдесв(), описанная в слслуюшсй глава. Эта Функция прсдотврашаст переполнение массива. Функция рясе<> выводит на экран строку символов и переводит курсор на следующую строку экрана. Ес прототип выглядг(т так. $ 1пс рисе (сопел сцах *<юреки) Сведения об основных консольных функциях привсдспы в табл.
8.). Таблица 8.! . Основные функции ввода-вывода Операция гоункция Считывает символ с клавиатуры; ожидает перехода на новую строку Считывает символ с клавиатуры и выводит его на экран; не ожидает перехода на но- вую строку; не определена в сганларте языка С/С++, но широко используется Считывает символ с клавиатуры и ие выводит его на экран; яе ожидает перехода на новую строку; не определена в стандарте языка С/С++, но широко используется Выводит символ на экран Считывает строку с клавиатуры Выводит строку на экран деьсьах О деасЬе() дессь() рисовая О двгвО ряса О Следующая программа демонстрирует применение нескольких основных консольных функций ввода-вывола при работе с компьютерным словарем.
Программа предлагает пользователю ввести слово, а затем проверяет, содержится ли это слово в базе данных. Если слово найдено, на экран выводится его значение. Обратите особое внимание на косвенную адресацию. Если вам нс понятно, как она применяется, вспомните, что переменная г)кс является массивом указатслси на строки.
/* Простой словарь. */ ккпс1ибе <вЫ1о.ц> дкпс1ибе <всгздд.Ь> $(пс1иде <ссуре.ц> /* Список слов и их значений */ с)гас *аьс() (40) = ( "автомобиль", 'Транспортное средство с двигателем. "атлас", "Собрание карт, изданное в виде книги.", "аэроплан", 'летавшая цапина. "телефон", "Средство связи,", /" нулевой символ, завершающий список */ 178 Часть!. Основы языка С++: подмножество С Функция рцсв (), как и функция рх1пск (), распоз) гает эсксйп-послсловатсльпости, например хп, предназначенную для перехода на новую строку.
На вызов функции риса() тратится меньше ресурсов. чем на функцию рхкпск(). поскольку опа может выводить лищь строки, но нс числа. Кремс того, она нс форматирует вывод. Таким образом, функция рисе() занимает меньше места и выполняется быстрее, чем функция рх1пск(). По этой причине функцию рмсв() часто применяют для оптимизации кода.
Если при выводе возникла ошибка, функция рисе() возвращает копста(пу код. В противном случае она возвращает псотрицатсльнос значение. Од(гако при выводе данных на консоль программисты редко учитывают возможность ошибки, поэтому значение, возвращаемое функцисй рисе(), проверяется редко. Следующий фрагмент выводит на экран слово "Привет". я дрога( "Привет"' ); з.пс юа1п(уоз8) ( спал иохй(00!, с?з; снах ""р; йо ( рисе(" 1прзяелите слсвсз '); ясапЕ(*'Ъя', иохй)з р = (снах *")йзсз /' Поиск соответствия и вывел значения л/ йо ( 11(.'яехстр(*р„ исхй)) ( роев(?виачеииез")з ревя(*(рь1))' Ьхеахз ) 11 О яххсзлр(*р, исхй)) Ьхеаиз р = р + 2? /* Перехзеюение яперел пс списку */ ) и?з11е(*р)з 11()*р) риТы("Слова я словаре иет.")з рХХПС1("ПрспспжИтЬ рабатУ? (У/Л)з "); ясап1(" %с%*с", асп)з ) ии11е(соиррех(сн) )= 'и')з хесихп 0? .'""'"~3 Форматированный ввод-вывод на консоль Функции рх1пех() и ясапх() выполняют форматированный ввод-вывод на консоль, иначе говоря, они могут считывать и записывать данные в зада)шом форматс.
Функция рх1псе() выводит данные на консоль. Функция ясапв(), наоборот, считывает данныс с клавиатуры. Обе функции могут оперировать любыми встроенными типами данных, включая символы, строки и числа. .::~~ Функция рппЩ) Прототип функции рх1пес () выглядит следующим образом. 8 хгзс рх хост(сопяс свах улравляюи(ая салака, ... ) Функция рх1пев() возвращает количесгво записанных ею символов, а в случае ошибки — отрицательное число, Параметр улравляюа(ая страха состоит из элементов двух видов.
Во-первых, он содержит символы, которые выводятся на экран. Во-вторых, в него входят спсцификаторы формата, начинающиеся со знака процента, за которым следует код формата. Количество аргументов должно совпадать с количеством спецификаторов формата, причем они попарно сравниваются слева направо. Например, вызов и рх1пх1("Я люблю ()с%я", 'С', "тт!")з выведет на экран строку Глава 8.
Ввод-вывод на консоль 179 ')цнкцпн рккосб() допускает широкий выбор спсцификатороа формата, пока- зшшзх л табл. 8.2. Таблица 8.2. Слецификаторы формата функции ргз пг.б () Формат Снмеоп Десятичное целое число со знаком Десятичное цепов число со знаком Научнын формат (строчная буква е) Научный формат (прописная буква Е) Десятичное число с плавающей точкой В зависимости от того, какой формат короче, применяется либо ъе, либо к в В зависимости от того, какой формат короче, применяется либо ък, либо че Восьмеричное число без знака Строка символов Десятичное целое число беэ знака Шестнадцатеричное число без знака (строчные буквы) Шестнадцатеричное число без знака (прописные буквы) Указатель Указатель на целочисленную переменную.
Слецнфнкатор вызывает лрнсеанеанне этой целочисленной переменной количества символов, выведенных перед ним Знак тз Вывод символов Для вывода отдельных символов используется спсцификатор жс. В результате соответствующий аргумент без изменений будет еыасдсн на экран. Для вывода строк применяется спецификатор гке, Вывод чисел Для вывода десятичных целых чисел со знаком применяются спсцнфикаторы ъгт или ъз. Эти спсцификаторы эквивалентны. Одновременная поддержка обоих специфнкаторов обусловлена историческими причинами. Для вывода целого числа без знака слсдуст применять спсцификатор яи. Спсцнфикатор формата Ъб позволяет выводить на экран числа с планаюшси точкой. Спсцификаторы ъв и ззж сообщают функции ркзпсб(), что на экран выводится аргумент типа гтоцтззе в научном формате.