Ввод вывод с использованием стандартной библиотеки ввода-вывода 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* Строка); Выводит на экран строку.