Ввод/вывод в С
Функции ввода/вывода определены в заголовочном файле <stdio.h>
Вывод осуществляется функцией printf, которая имеет следующий синтаксис:
printf (<строка описания форматов> [, <список вывода> ]);
Строка описания форматов состоит из обычных символов, специальных управляющих последовательностей символов и спецификаций формата.
Обычные символы и управляющие последовательности просто копируются в стандартный выходной поток в порядке их появления.
Спецификации формата начинаются с символа % и заканчиваются символом, определяющим тип выводимого значения. Кроме того, спецификации формата могут содержать символы и цифры для управления видом выводимого значения (подробно см. ниже). Список вывода состоит из переменных и/или констант, значения которых должны быть выведены. Количество спецификаций формата должно быть равно количеству выводимых значений, которые указываются в списке вывода. Если это условие не будет соблюдаться, выполнение функции может привести к непредсказуемым результатам.
Ввод осуществляется функцией scanf, которая имеет следующий синтаксис:
scanf (<строка описания форматов> [, <список ввода> ]);
Строка описания форматов состоит из набора спецификаций формата, таких же, как для функции printf. Список ввода состоит из адресов переменных, куда будут заноситься вводимые значения. Адрес переменной вычисляется с помощью унарной операции &. Количество спецификаций формата должно быть равно количеству вводимых значений, которые указываются в списке ввода.
К управляющим последовательностям относятся следующие последовательности символов.
Последовательность | Дейcтвие |
\a | Звуковой сигнал |
\b | Удаление предыдущего символа |
\n | Новая строка |
\r | Возврат каретки |
\t | Табуляция |
\' | Апостроф |
\" | Кавычки |
\\ | Обратный слеш |
\ ooo | ASCII символ в восьмеричной нотации |
\x ooo | ASCII символ в шестнадцатеричной нотации |
Спецификация формата, которая состоит из обязательных и необязательных полей, имеет следующий вид:
|
%[ флаги ] [ ширина ] [ .точность ] [ {h | l | L | I64} ] тип
Флаги | Значение | По умолчанию |
– | Выравнивание по левому краю. | Выравнивание по правому краю. |
+ | Добавление знака + или – перед числами. | Знак добавляется только перед отрицательными числами. |
Добавление нулей перед выводимым значением. Если одновременно используются флаги – и 0, 0 игнорируется. | Добавление пробелов. | |
пробел | Добавление пробела перед положительным числом. Если одновременно используются флаги пробел и +, пробел игнорируется. | Пробел не добавляется. |
# | Добавление символов 0, 0х или 0Х перед ненулевым значением, если флаг # используется с форматами о, х или Х соответственно. | Символы 0, 0х и 0Х не добавляются. |
При использовании с форматами e, E и f флага # выводимое число будет содержать десятичную точку в любом случае. | Десятичная точка добавляется, только если за ней следуют цифры. | |
При использовании с форматами g и G флага # выводимое число будет содержать десятичную точку и хвостовые нули в любом случае. | Десятичная точка добавляется, только если за ней следуют цифры. Хвостовые нули не выводятся. | |
Игнорируется при использовании с форматами c, d, i, u и s. |
Поле ширина содержит минимальное количество выводимых символов – неотрицательное целое число. Если выводимое значение содержит меньше символов, то оно расширяется пробелами (если не задан флаг 0). Если поле ширина содержит звездочку (*), то в качестве значения поля берётся целое число из списка аргументов, предшествующее выводимому значению.
|
Поле точность также представляет собой неотрицательное целое число. Действие зависит от типа выводимого значения.
Тип | Действие | По умолчанию |
c, C | Точность не имеет эффекта. | Выводится символ. |
d, i, u, o, x, X | Точность задаёт минимальное количество символов, которые будут напечатаны. Если число содержит меньше символов, оно расширяется нулями. | Точность равна 1. |
e, E, f | Точность задаёт количество символов после десятичной точки. Число округляется. | Точность равна 6. Если точность равна 0 или опущена, десятичная точка не выводится. |
g, G | Точность задаёт максимальное количество значащих цифр. | Печатается 6 значащих цифр. |
s, S | Точность задаёт максимальное количество выводимых символов. | Выводятся все символы строки. |
Если поле точность содержит звездочку (*), то в качестве значения поля берётся целое число из списка аргументов, предшествующее выводимому значению.
Дополнительные префиксы h, l, L и I64 задают «размер» аргумента – long или short, однобайтовый символ или расширенный символ, в зависимости от спецификации типа, которую они модифицируют.
Обязательное поле тип задаёт тип выводимого значения.
Символ | Тип | Формат вывода |
c | int или wint_t | При использовании с функцией printf определяет однобайтовый символ, при использовании с функцией wprintf определяет расширенный символ. |
C | int или wint_t | При использовании с функцией printf определяет расширенный символ, при использовании с функцией wprintf определяет однобайтовый символ. |
d | int | Знаковое десятичное целое. |
i | int | Знаковое десятичное целое. |
o | int | Беззнаковое восьмеричное целое. |
u | int | Беззнаковое десятичное целое. |
x | int | Беззнаковое шестнадцатеричное целое с использованием символов «abcdef». |
X | int | Беззнаковое шестнадцатеричное целое с использованием символов «ABCDEF». |
e | double | Знаковое число в форме [ – ]d.dddd e [знак]ddd, где d есть одна десятичная цифра, dddd – одна или более десятичных цифр, ddd – три десятичные цифры and знак есть + или –. |
E | double | Идентичен формату e, за исключением того, что символ E, а не e вводит экспоненту. |
f | double | Знаковое число в форме [ – ]dddd.dddd, где dddd есть одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины числа, а количество цифр после десятичной точки – от требуемой точности. |
g | double | Знаковое число в формате f или e, в зависимости от того, какой формат более компактен для заданного значения и точности. |
G | double | Идентичен формату g, за исключением того, что символ E, а не e вводит экспоненту. |
n | pointer tointeger | Количество символов успешно записанных к данному моменту в выходной поток. Это значение сохраняется в целочисленной переменной, чей адрес задан как аргумент. |
p | pointer tovoid | Печатает адрес, заданный аргументом. |
s | string | При использовании с функцией printf задаёт строку однобайтовых символов, при использовании с функцией wprintf задаёт строку расширенных символов. Символы печатаются до достижения признака конца строки. |
S | string | При использовании с функцией printfзадаёт строку расширенных символов, при использовании с функцией wprintf задаёт строку однобайтовых символов. Символы печатаются до достижения признака конца строки. |
|
int m, n, x;
double y;
char c = '&';
char str[] = "String";
scanf("%d%d", &m, &n); // Ввод десятичных целых чисел в переменные m и n
printf("m = %5d\nn = %5d\n", m, n); // Вывод переменных m и n в десятичном целом формате, используются как минимум 5 знаков
scanf("%d", &x); // Ввод десятичного целого числа в переменную x
printf("%#010x\n", x); // Вывод переменной x в шестнадцатеричной системе, используются 10 знаков, впереди добавляются нули и символы 0х
scanf("%lf", &y); // Ввод вещественного числа в переменную y
printf("y = %7.2lf\n", y); // Вывод вещественной переменной, используются как минимум 7 знаков, из них 2 – после точки
printf("c = %c\n", c); // Вывод одного символа
printf("%.4s\n", str); // Вывод строки (не более 4 символов)
Чтение из строки/запись в строку
A. Функции sprintf и sscanf позволяют произвести запись значений переменных в форматированную строку или чтение переменных из строки:
int sscanf (char * str , char * format ,...);
int sprintf (char * str , char * format ,...);
Эти функции во всём аналогичны функциям printf и scanf, только в качестве первого параметра указывается строка, куда записываются или откуда считываются данные.
B. Функции gets и puts
gets () Читает строку с клавиатуры
puts () Выводит строку на экран
Потоковый ввод/вывод
В языке С++ был разработан другой способ ввода/вывода с использованием так называемых потоков ввода и вывода.
Поток — это некоторая абстракция, отражающая перемещение данных от источника к приемнику.
Использование стандартных потоков cin и cout
Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл <iostream>.
Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует её.
#include <iostream>
using namespace std;
cin >> x; // Ввод значения в переменную x из стандартного потока cin
cout << x; // Вывод значения переменной x в стандартный поток cout
cin >> x >> y; // Ввод двух переменных
cout << "x = " << x << "\ny = " << y << endl; // Функция endl осуществляет перевод строки
Если при вводе или выводе произошла ошибка, в переменной состояния потока устанавливается соответствующий флаг. Проверить его значение можно с помощью функции fail.
cin >> x;
if (cin.fail())
cout << "Произошла ошибка при вводе\n";
Форматирование
Для управления форматом вводимого/выводимого значения используются так называемые манипуляторы. Это функции, которые вставляются между вводимыми/выводимыми значениями и изменяют состояние потока.
Для использования манипуляторов необходимо включить заголовочный файл <iomanip>.
Манипулятор — объект особого типа, который управляет потоками ввода/вывода, для форматирования передаваемой в потоки информации.
Таблица 1 Манипуляторы форматирования в С++
Манипулятор | Назначение | Пример | Результат |
endl | Переход на новую строку при выводе | cout << «website:» << endl << «cppstudio.com»; | website: cppstudio.com |
boolalpha | Вывод логических величин в текстовом виде (true, false) | bool log_false = 0, log_true = 1; cout << boolalpha <<log_false << endl << log_true << endl; | false true |
noboolalpha | Вывод логических величин в числовом виде (true, false) | bool log_true = true; cout << noboolalpha << log_true << endl; | |
oct | Ввод/вывод величин в восьмеричной системе счисления | int value; cin >> value; cout <<oct<< value << endl; | ввод:9910 вывод:1438 |
dec | Ввод/вывод величин в десятичной системе счисления (флаг установлен по умолчанию) | int value = 148; cout << dec<< value << endl; | |
hex | Ввод/вывод величин в шестнадцатеричной системе счисления | int value; cin >> value; cout <<hex<< value << endl; | ввод:9910 вывод:6316 |
showbase | Выводить индикатор основания системы счисления. Указывает, что основание числа должно выводиться перед числом: для восьмеричных чисел выводится начальный символ "0", десятичные числа выводятся обычным способом, шестнадцатеричные числа выводятся с индикатором "0x" или "0X". | int value; cin >> value; cout <<oct << showbase<<value << endl; | ввод:9910 вывод:01438 |
noshowbase | Не выводить индикатор основания системы счисления (по умолчанию). | int value = 64; cout << noshowbase << hex << value << endl; | |
uppercase | В шестнадцатеричной системе счисления использовать буквы верхнего регистра(по умолчанию установлены буквы нижнего регистра) | int value; cin >> value; cout << hex<< uppercase << value << endl; | ввод:25510 вывод:FF16 |
nouppercase | В шестнадцатеричной системе счисления использовать буквы нижнего регистра (по умолчанию). | int value = 255; cout << nouppercase << hex << value << endl; | ff16 |
scientific | Вывод чисел с плавающей точкой в экспоненциальной форме | double value = 1024.165; cout << scientific << value << endl; | 1.024165e+003 |
showpos | Вывод знака плюс + для положительных чисел | int value = 15; cout << showpos << value << endl; | +15 |
noshowpos | Не выводить знак плюс + для положительных чисел (по умолчанию). | int value = 255; cout <<noshowpos<< value << endl; | |
fixed | Вывод чисел с плавающей точкой в фиксированной форме (по умолчанию) | double value = 1024.165; cout << value << endl; | 1024.165 |
setw(int number) | Установить ширину поля, где number — количество позиций, символов (выравнивание по умолчанию по правой границе). Манипулятор с параметром. | cout << setw(40) << «cppstudio.com» << endl; | __cppstudio.com |
right | Выравнивание по правой границе(по умолчанию). Сначала необходимо установить ширину поля(ширина поля больше чем, длина выводимой строки). | cout << setw(40)<< right <<"cppstudio.com" << endl; | __cppstudio.com |
left | Выравнивание по левой границе. Сначала необходимо установить ширину поля (ширина поля больше чем, длина выводимой строки). | cout << setw(40)<<left<<"cppstudio.com" << endl; | cppstudio.com__ |
Internal | Показывает, что знак числа должен быть выровнен по левой границе поля, а значение числа – по правой границе. В промежуточные позиции размещаются заполняющие символы. | int x=-254; cout << setw(10)<<internal<< x << endl; | - 254 |
setprecision(int count) | Задаёт количество знаков после запятой, где count — количество знаков после десятичной точки | cout << fixed << setprecision(3) << (13.5 / 2) << endl; | 6.750 |
setfill(int symbol) | Установить символ заполнитель. Если ширина поля больше, чем выводимая величина, то свободные места поля будут наполняться символом symbol— символ заполнитель | cout << setfill(‘0′) << setw(4) << 15 << ends << endl; |