Форматированный ввод-вывод
Особенностью С++ является отсутствие специальных операторов ввода-вывода. Вместо этого используются библиотечные функции. Далее предельно кратко рассматриваются некоторые функции Borland С++ для ввода информации с клавиатуры и ее вывода на экран. Подробно ввод-вывод информации, в том числе и работа с дисками, рассматривается во второй книге комплекса.
Консольный ввод-вывод может быть двух видов: форматированный и неформатированный. Форматированный ввод-вывод даст возможность обрабатывать за одно обращение к библиотечной функции несколько элементов, выполняя, если необходимо, преобразование данных. Две функции-компаньона – scanf() и printf() выполняют соответственно консольный ввод и вывод. Этим функциям передастся переменное число аргументов, но первым аргументом всегда является текстовая (так называемая форматная) строка. Она задает способ преобразования данных. Функция printf() выдаст на экран всю форматную строку, в которой знак %ххх заменяется символами выводимой информации. Символы после % до первого разделителя рассматриваются как спецификация преобразования значения выводимой переменной. Имя переменной - это второй, третий и т.д. аргументы списка аргументов. Правила использования функции printf() представлены на рис. 3.
Функция scanf() принимает с консоли все символы до нажатия клавиши ENTER и помещает их в буфер. Затем по форматной строке определяется способ преобразования введенных символов в соответствии с заданными спецификациями. Полученное в результате преобразования число помещается по адресу переменной, который является вторым, третьим и т.д. аргументом в списке аргументов функции. Спецификация преобразования задается в виде последовательности
% [флаги ] [ширина ] [.точность J [F S N i h! 1 ]<тип>
В табл. 5 перечисляются некоторые из знаков, задающих спецификацию преобразования.
Рис. 3. Правила использования функции printf().
Таблица 5.
Символы управления форматированием
Элемент специфика-ции | Производимый эффект |
Флаги | |
- + Пробел # | Производится выравнивание влево выводимого числа в пределах выделенного поля. Правая сторона выделенного поля дополняется пробелами. По умолчанию устанавливается выравнивание вправо Выводится знак числа символом ‘-‘ или ‘+’ Выводится пробел перед числом, если оно положительно. Для отрицательных чисел знак ‘-‘ выводится всегда Выводится идентификатор системы счисления для целых: 0 перед числом, выводимым в восьмеричной с/с; 0х или 0Х для чисел, выводимых в шестнадцатеричной с/с; ничего для чисел, выводимых в десятичной с/с Выводится десятичная точка для чисел типа float |
Ширина | Воздействует только на вывод |
n 0n * | Определяет минимальную ширину поля в n символов. Если после преобразования ширины недостаточно, выводится столько символов, сколько есть. Незаполненные позиции дополняются пробелами Все то же самое, но позиции слева для целого числа дополняются нулями Следующий аргумент из списка аргументов задает ширину |
Точность | Воздействует только на вывод |
Ничего .0 .n * | Точность по умолчанию Для d, i, o, u, x точность по умолчанию. Для e, E, f десятичная точка отсутствует Для e, E, f не более n знаков после точки Следующий аргумент из списка аргументов - точность |
Модификатор | Воздействует там, где применимо |
h l | Для d, i, o, u, x, X аргумент является short int Для d, i, o, u, x, X аргумент является long int Для e, E, f, g, G аргумент является double (только для scanf) |
Тип преобра-зования | |
c d i o u x X f e E g G s | ТИП ПЕРЕМЕННОЙ: CHAR При вводе – из файла читается и передается переменной один байт. При выводе – переменная преобразуется к типу char. В файл передается один байт ТИП ПЕРЕМЕННОЙ: INT Десятичное int со знаком Десятичное int со знаком Восьмеричное int unsigned Десятичное int unsigned Шестнадцатеричное int unsigned; при выводе числа используются символы 0-f Шестнадцатеричное int unsigned; при выводе числа используются символы 0-F При вводе различия х и Х не оказывают никакого эффекта ТИП ПЕРЕМЕННОЙ: FLOAT Значение со знаком в форме [-]dddd.dddd Значение со знаком в форме [-]d.dddde[+|-]ddd Значение со знаком в форме [-]d.ddddE[+|-]ddd При вводе нет различия между е и Е Значение со знаком в формате ‘e’ или ‘f’ в зависимости от значения и специфицированной точности Значение со знаком в формате ‘E’ или ‘F’ в зависимости от значения и специфицированной точности При вводе нет различия между g и G ТИП ПЕРЕМЕННОЙ: CHAR* При вводе принимает символы без преобразования до тех пор, пока не встретится ‘\n’ или пока не достигнута специфицированная точность. В программу передаются символы до ‘\n’ или пробела. При выводе выдает в поток все символы до тех пор, пока не встретится ‘\0’ или пока не достигнута специфицированная точность |
Приведем пример выполнения ввода-вывода информации:
// Prim3_1.cpp
#include <stdio.h>
void main(void)
{
char ch; int i, j; float х, x2; char name[81];
printf("\nВведите Ваше имя: "); scanf("%s", name):
printf("Здравствуйте, %s. Вас приветствует звонком компьютер\а\n", name);
printf("Введите любое целое число: ");
fflush(stdin);
scanf("%d", &i);
j = i + 4;
printf("%d+ 4 = %d, верно?\n", i, j);
printf("Введите число с плавающей точкой: ");
scanf("%f", &х);
x2 = х • х;
printf("% f в квадрате = %f, верно?", x, x2);
printf("Введите любой символ:");
fflush(stdin);
scanf("%c", &ch);
printf("ASCII-код символа %c = %d (%#x)\n", ch, ch, ch);
}
Далее приводятся результаты работы программы
g:\l3_1 - запуск программы на выполнение;
Введите ваше имя: Александр Касаткин
Здравствуйте, Александр. Вас приветствует звонком компьютер
Введите любое целое число: 36
36 + 4 = 40, верно?
Введите число с плавающей точкой: 5.е1
50.000000 в квадрате = 2500.000000, верно?
Введите любой, символ: 1
ASCII-код символа 1 - 49 (0х31)
Программа последовательно выдает приглашения. После набора запрашиваемой информации следует нажать клавишу ENTER. После ее нажатия функция scanf() прекращает прием символов во внутренний буфер и переходит к обработке ввода в соответствии с форматной строкой. Обратите внимание, что на приглашение ввести имя в буфер функции было помещено два слова - имя и фамилия. При выводе же строки name функцией printf() на экране появляется только первое слово - имя. Дело в том, что по спецификации %s функция scanf() передает в программу все символы до первого разделителя, в том числе и пробела. Оставшиеся в буфере символы будут поступать в программу при следующих обращениях к функции scanf(), что не входит в наши планы. Вот почему перед очередным обращением к функции scanf() выполняется очистка буфера stdin функцией fflushf(). После вывода на экран второй строки звенит звонок, так как на консоль выдается символ `\а`.
Функции неформатированного консольного ввода-вывода работают с отдельными символами или строками символов. Для ввода символа используется функция getchar(), не имеющая аргументов и возвращающая целое число. Для вывода символа используется функция putchar(int). Ввод-вывод строк символов выполняют соответственно функции gets(char *string) и puts(char *string), где string задает адрес области памяти, в которую помещаются символы вводимой строки и откуда они выводятся на экран. Функции gets(string) и puts(string) пo выполняемым действиям подобны scanf("%s",string) и printf("%s\n",string) соответственно. Однако функция gets() передает в программу все символы до '\n'. Поэтому, заменив в предыдущей программе строку ввода имени scanf("%s", name); на строку gets(name); удалось бы ввести как имя, так и отчество.
Функция ввода cin
Компиляторы языка С++ поддерживают функции gets(), getchar() и scanf(), о которых мы говорили в этой главе. Кроме того, С++ имеет собственное многоцелевое средство ввода для всех типов данных. Стандартный поток ввода cin в сочетании с двумя символами «больше» (>>), которые называются оператором извлечения, служит для считывания данных с клавиатуры. Программа
int count;
cin » count;
вносит целочисленные данные с клавиатуры в значение переменной count. Стандартный поток ввода cin не требует указания адреса переменной для числовых и символьных данных, указывается только имя переменной.
При использовании cin нет необходимости определять формат с помощью указателей формата. Поток ввода cin имеет возможность определять тип данных самостоятельно на основании вводимой информации. Это свойство называется перегрузкой. Из-за этой особенности оператора cin большинство программистов предпочитают использовать именно его, а не функцию scanf().
При работе с несколькими аргументами необходимо отделять каждое имя переменной оператором извлечения:
cin » amount » count » age » name;
Возможно, первое время вы будете испытывать затруднения в использовании операторов извлечения » и вставки «. На рис. 4 показан простой способ запоминания этих операторов, изображенных в виде стрелок, которые указывают направление вперед или назад относительно переменной из списка данных.
Оператор извлечения » изображен в виде стрелки, направленной в сторону переменной. Это означает, что данные поступают к ней в виде ввода.
Рис. 4. Оператор вставки и оператор извлечения
Когда вы применяете cin для ввода данных, пользуйтесь оператором, который как бы указывает направление к переменной.
Оператор вставки « изображен в виде стрелки, направленной от переменной. Это значит, что данные выводятся из переменной на экран. Со стандартным потоком вывода cout используйте, соответственно, тот оператор, который как бы указывает направление от переменной.
Дата добавления: 2017-01-29; просмотров: 987;