Г. Шилдт - Полный справочник по C++ (1109478), страница 106
Текст из файла (страница 106)
Глава 25, Функции ввода-вывода языка С Таблица 25.3. Слецификаторы формата функции зсап(() Кол Символ Десятичное целое число со знаком Десятичное цепов числа со знаком, восьмеричное ипи шестнадцатеричное число Десятичное числа с плавающей точкой Десятичное число с плавающей точкои Десятичное число с ппавающеи точкой Восьмеричное число Строка символов Десятичное целое число без знака Шестнадцатеричное число без знака (строчные буквы) Указатель Указатель на целочисленную переменную. Спецификвтор вьаывает присваиванне атой целочисленной переменной количества символов, введенных перед ней Набор сканируемых символов Знак ч вс ьл ы че чс чо допускает ввод чисел 1о 20, но не разрешает вводить строку 1о. 20.
Можно заставить функцию всвпб() считывать поле, не присваивая его ни одной переменной. Для этого перед колом соогветствуюшего формата следует поставить символ *. Например, если применить вызов в явсапб("кс)в*с%с)", йх, Ьу)г Часть ))). Библиотека стандартных функций по умолчанию спецификаторы к, е и я сообшают функции вселя(), что вводится число с плаваюшей точкой. Если перел этими спецификаторами стоит буква 1 ("'эль"), ввепенное значение будет присвоено переменной типа пса)з1е. Префикс ь означает ввод значения типа 1опд 6аиЬ1е.
Начиная с (995 года компиляторы подлержшгают работу с расширенными символами. Лля этого к спецификатору с применяется модификатор 1. В этом случае он задает расширенный сил(вол, на который ссылается указатель типа ис)твк е. Аналогично, если модификатор 1 стоит перед спецификатором в, на экран выводится строка расширенных символов. Кроме того, символ 1 используется для молификации набора сканируемых расширенных символов. Разлелитель в форматной глроке вынуждает функцию всвпк() пропусппь один или несколько разделителей из патока ваала. В качестве разделителей используются пробел, символ табуляции и символ перехода на новую строку.
По сушеству, один разлелитель в управляюшей строке вынуждает функцию вселб() считать, не записывая, произвольное количество разделителей, пока не будет обнаружен символ, не являю|цийся раззелителем. Символы, не являющиеся разлелителями, вынуждают функцию всеоб() считывать и пропускать заданные символы. Например, управляющая строка "зкб,ззб" заставляет функцию всеоб() считать целое число, прочитать и отбросить запятую, а затем считать следующее целое число. Голи указанный символ не найден, функция всеоб ( ) прекрашает работу.
Все переменные, получающие свои значения с помошью функции всеоб(), передаются ей по адресу, Это означает, по аргументы функции всезтб() должны быть )казателямн. Входные ленные должны разлеляться пробелами, символами табуляции или символами перехода на новую строку. Знаки пунктуации, такие как запятые, точки с запятой и тому подобное не считаются разделителями.
Это зна шт, что оператгтр )( всвпг("кс)"о", йк, йс]г к паре тоуто, то функция асхад() считает число !О и присвоит его переменной х, затем отбросит знак деления и присвоит число 20 переменной у В форматной строке можно указывать молификатор максимальной ширины поля. Это целое число, стояшее межлу символом зь и кодом формата. Оно ограничивает количество символов, которое можно считать из поля.
Например, если в переменную а()- бгавв необхолимо считать не более 20 символов, следует написать следуюший оператор. й эсапХ("$20в", ассЬевв); Если длина входной строки превышает 20 символов, следую)ций вызов функции всапя() начнет считывание с символа, на котором остановился прельпушии вызов. Если при вволе обнаружится разделитель, считывание символов завершится лосрочно. В этом случае функция всапх () переходит к слелуюшему полю.
Несмотря на то по пробелы, знаки табуляции и символы перехода на новую строку используются как разделители при чтении данных любых типов, при вводе отдельных символов они считывлкнся наравне со всеми. Например, если поток ввода содержит строку "х у", то Фрагмент кода й апаса("ЬсЪсЪс", ьа, ьЬ, ас); присвоит символа переменнои а. пробел — переменной )з и символ у — переменнои с. Будьте осторожны: любые другие символы в управляюшей строке, включая пробелы, знаки табуляции и символы перехода на новую строку, используются для подавленил разделителей, находяшихсл в потоке ввода. Наприл1ер, если в потоке ввода записаны символы 1ое20, вызов й апаса("Вс)с%о".
йх, ьу); запишет число )О в переменную х, а число 20 — в переменную у. Сил(вол е будет отброшен, поскольку он указан в управляюшей строке. Функция асапд() поддерживает спецификатор универсально~о формата, называемый лабором сканируемых гимволоа (зсапзе(). При обработке этого спецификатора функция будет вводить только те символы, которые входят в заданный набор. Символы записываютсл в массив, на который ссылается соответствуюший аргумент.
Для того чтобы опрелелить набор сканируемых символов, лостаточно перечислить их в квалратных скобках. Перед открываюшей квадратной скобкой указывается символ процента. Например„слелуюший набор сканируемых символов означает, что функция ассад () должна вводить лишь символы л, в и О. я % (Авс) При использовании набора сканируемых символов функция всапд() продолжает считывать символы, помешал их в соответствуюший массив, пока не обнаружится символ, не входяший в заланный набор. По возврашении из функции асхад() массив будет содержать строку, состояшую из считанных элементов и завершаюшуюся нулевым байтом. Если первым символом набора является знак "„набор сканируемых символов трактуется наоборот.
Знак " сообшает функции всход(), что она должна вволить только символы, ле опрелеленные в наборе. В большинстве реализаций можно задавать диапазон символов, используя лефис. Например, следуюший спецификагор ограничивает ввод символов диапазоном от ъ до я. итст пом;ппгч )то набор скапирусмых симл лов зависит от реп)стра. Если требуется ввести как прописные, так и строчные буквы, их следует указывать отдельно. Глава 25. Функции ввода-вывода языка С Функция зсапх() возвращает количество успешно введенных полей.
В зто число не входят поля, которые были считаны, но не присвоены никаким переменным, поскольку были полавлены модификатором ". Если еше до первого присваивания введенного поля возникла ошибка, функция возврагцает константу еп(г. Зависимые функции: рк1псх() и кзеапх(). Функция зе1ЬФ 1 Нтпс1ц<)е <сзсс)хо> ъгоз<) зесЪий(ехЬЕ *пгеав, сцат *Ьиг); Функция зесцид() либо указывает буфер, который будет использоваться потоком игеав„либо отключает буферизацию, если вызывается с нулевым аргументом.
Длина буфера, определенного программистом, должна быть равна константе впрвхе, опрелеленной в заголовке <езсцьо>. Функция зесЪпл() не возвращает никаких значений. Зависимые функции: корее(), хохове() и нееъцел(). Функция за(ЬиЕ Мхпс1ц<)е <сзсдхо> чоЫ зесъЪиб(вхье гггеав, сцат *Ьз)', зос ва(е, зтзе с зце) г Функция зесзгъех() позволяет программисту задать буфер„его размер и режим указанного потока. В качестве буфера вывода-вывода используется символьный массив, адресуемый указателем Ьи(: Размер буфера задается параметром з)хе, а режим потока — параметром воИа Если функция зесецел() вызывается с нулевым аргументом ЬиХ она заллет свой собственный буфер.
Параметр вог(е должен принимать значения хорвз', хомвр и хопер, определенные в заголовке <езег)хо>, Если параметр тот(е равен значению хорвр, применяется полноценная буферизация. Если параметр вот(е равен значению хоьвз', используется буферизация строк. Зто означает, что буфер будет очищаться каждый раз, когда в поток вывода записывается символ перехола на новую строку.
Ввод буферизуется, пока не булет считан символ перехола на новую строку. Если параметр воле равен значению хомвр, буферизация не применяется. В случае успеха функция зеезгцех() возвращает нуль, в противном случае она возвращает ненулевое значение. Зависимая функция: зеецик () . Функция зрпп0 Нхпс1иг)е <сзсс)хо> хпг зртхпсй(спас *Ьнт, сопле сцас )апааг," ... ) г Функция зрк1псх() илентична функции рк1псх(), но вместо консоли она выволит ланные в массив. адресуемый указателем Ьи1". Детали описаны в разлеле, посвя)ценном функции рсзпсх () . Функция возвращает значение, равное количеству символов, фактически записанных в массив.