Ввод вывод с использованием стандартной библиотеки ввода-вывода stdio.h
Манипуляторы и форматирование ввода-вывода
Часто бывает необходимо вывести строку или число в определенном формате. Для этого используются так называемые манипуляторы.
Манипуляторы – это объекты особых типов, которые управляют тем, как обрабатывают последующие аргументы. Некоторые манипуляторы могут также выводить или вводить специальные символы. Манипуляторы позволяют задавать формат вывода чисел.
Таблица 1 – Манипуляторы потокового ввода-вывода
Манипулятор | Назначение |
endl | при выводе перейти на новую строку; |
ends | вывести нулевой байт (признак конца строки); |
flush | вывести и очистить все промежуточные буферы; |
dec | выводить числа в десятичной системе (по умолчанию); |
oct | выводить числа в восьмеричной системе; |
hex | выводить числа в шестнадцатеричной системе счисления; |
setw (int n) | установить ширину поля вывода в n символов (n – целое число); |
setfill(int n) | установить символ-заполнитель, которым выводимое значение будет дополняться до необходимой ширины; |
setprecision(int n) | установить количество цифр после запятой при выводе вещественных чисел; |
setbase(int n) | установить систему счисления для вывода чисел; n может принимать значения 0, 2, 8, 10, 16, причем 0 означает систему счисления по умолчанию, т.е. 10. |
Использовать манипуляторы просто – их надо вывести в выходной поток. Выведем одно и то же число в разных системах счисления:
int x=53;
cout <<"Десятичный вид: " << dec << x << endl
<< "Восьмеричный вид: " << oct << x << endl
<<"Шестнадцатеричный вид:" << hex << x << endl;
Аналогично используются манипуляторы с параметрами. Вывод числа с разным количеством цифр после запятой:
double x;
// вывести число в поле общей шириной
// 6 символов (3 цифры до запятой,
// десятичная точка и 2 цифры после запятой)
cout << setw(6) << setprecision(2) << x << endl;
Те же манипуляторы (за исключением endl и ends) могут использоваться и при вводе. В этом случае они описывают представление вводимых чисел. Кроме того, имеется манипулятор, работающий только при вводе, это ws. Данный манипулятор переключает вводимый поток в такой режим, при котором все пробелы (включая табуляцию, переводы строки, переводы каретки и переводы страницы) будут вводиться. По умолчанию эти символы воспринимаются как разделители между атрибутами ввода.
int x;
// ввести шестнадцатеричное число
cin >>hex >>x;
Ввод вывод с использованием стандартной библиотеки ввода-вывода stdio.h
Все возможности организации ввода-вывода СИ реализованы в библиотечных функциях стандартной библиотеки stdio.h.
Для организации вывода используется функция
printf(форматная_строка,список_аргументов);
Форматная строка ограничивается кавычками «”» и может включать произвольный текст, управляющие символы и спецификации преобразования данных.
Список аргументов может отсутствовать.
#include "stdafx.h"
#include <stdio.h>
void main()
{
printf("\nhello!\n");
}
Препроцессорная директива #include <stdio.h> подключает стандартную библиотеку ввода-вывода. «\n» – перевод строки (управляющий символ).
При организации вывода данных на экран используются спецификации преобразования, которые имеют следующий обобщённый вид:
%флажки ширина_поля.точность модификатор спецификатор
Обязательными являются «%» и спецификатор.
Таблица 5 – Назначение флагов
Флаг | Назначение |
- | Выравнивание результата по левому краю поля. |
+ | Результат всегда выводится с указанием знака «+» или «-». |
Пробел | Если значение не отрицательное, то вместо плюса выводится пробел, для отрицательных значений выводится «-». |
# | Аргументы могут быть преобразованы с использованием альтернативной формы |
ширина_поля – целое положительное число, определяющее количество знакомест для вывода значения.
точность – целое положительное число, определяющее количество цифр после десятичной запятой для вывода значения с плавающей точкой.
Возможные модификаторы представлены в таблице 6.
Таблица 6 – Назначение модификаторов
Модификатор | Назначение |
N | Для близкого указателя |
F | Для дальнего указателя |
h | Для значения short int |
l | Для значения long |
L | Для значения long double |
Спецификаторы определяют тип выводимого значения и форму вывода.
Таблица 7 – Назначение спецификаторов
Спецификатор | Тип аргумента | Назначение |
d | Целого типа | Для целых десятичных чисел (int) |
i | Целого типа | Для целых десятичных чисел (int) |
o | Целого типа | Для беззнаковых восьмеричных целых |
u | Целого типа | Для беззнаковых десятичных целых |
x | Целого типа | Для беззнаковых шестнадцатеричных целых (a,b,c,d,e,f) |
X | Целого типа | Для беззнаковых шестнадцатеричных целых (A,B,C,D,E,F) |
Спецификатор | Тип аргумента | Назначение |
f | вещественный | Знаковое вещественное число в формате [+/-]ddd.dddd |
e | вещественный | Знаковое вещественное число в формате [+/-]d.dddd или в экспоненциальной форме |
g | вещественный | Знаковое вещественное число в формате или f, или e (в зависимости от выводимого значения) |
E | вещественный | Такое же, как и e |
G | вещественный | Такое же, как и g |
s | строковый | ввод-вывод строковых данных |
c | символьный | ввод-вывод символов |
Например:
printf(“|n summa=%f”,summa);
На экране будет выведено:
Summa=2102.3
После выполнения операторов:
float c=48.3, e=16.33;
int k=-83;
printf(“\nc=%f\tk=%d\te=%e”,c,k,e);
на экране будет выведено
c=48.299999 k=-83 e=1.63300e+01
Для тех же переменных:
printf(“\nc=%5.2f\tk=%5d\te=%8.2f\te=%11.4e”,c,k,e,e);
на экране будет выведено
c=48.30 k= -83 e=16.33 e= 1.6330e+01
В состав строки вывода могут входить управляющие последовательности:
‘\n’ – перевод строки;
‘\t’ – горизонтальная табуляция;
‘\r’ – возврат каретки к началу строки;
‘\\’ – обратная косая черта \;
‘\’’ – апостроф ‘;
‘\0’ – нулевой символ;
‘\a’ – сигнал-звонок;
‘\b’ – возврат на одну позицию;
‘\f’ – перевод строки;
‘\v’ – вертикальная табуляция;
‘\?’ – знак вопроса.
Для организации ввода данных с клавиатуры используется функция
scanf(форматная_строка, список_аргументов);
Эта функция выполняет чтение значений вводимых с клавиатуры и присваивает их последовательно аргументам. Форматная строка представляет собой последовательность спецификаций, управляющих преобразованием вводимых значений.
%*ширина_поля модификатор спецификатор
‘*’ в настоящее время не используется;
Ширина_поля – целое положительное число, позволяющее определить, какое количество байтов из входного потока соответствует вводимому значению.
модификатор и спецификатор – аналогичны функции printf().
Аргументами функции ввода могут быть адреса переменных, которым будут присвоены вводимые значения. Они задаются при помощи операции взятия адреса “&имя_переменной”
Например:
scanf(“%d%f%f”,&n,&z,&x);
При организации ввода-вывода данных используются также функции, описанные в стандартной библиотеке ввода-вывода(<stdio.h>):
puts(const char* Строка);Выводит на экран строку символов и переводит курсор в начало следующей строки экрана. В качестве параметра функции можно использовать строковую константу или строковую переменную.
char *gets(char* s);Вводит с клавиатуры строку символов. Вводимая строка может содержать пробелы.
int putch(int с);Выводит на экран символ.
int getch(void);Возвращает код символа нажатой клавиши. Если нажата служебная клавиша, то функция getch возвращает 0. В этом случае, для того, чтобы определить, какая служебная клавиша нажата, нужно обратиться к функции getch еще раз. Замечание Функция getch не выводит на экран символ, соответствующий нажатой клавише.
cputs(const char* Строка); Выводит на экран строку.