return 0;
}
Для вывода строк, состоящих из двухбайтных символов, предназначены объекты wcout, wcerr и wclog, также объявленные в файле iostream. Объект wcout предназначен для вывода обычных сообщений, а объекты wcerr и wclog для вывода сообщений об ошибках. Например:
std::wcout << L"String";
Так как данные перед выводом могут помещаться в буфер, вполне возможно потребуется сбросить буфер явным образом. Для этого можно использовать метод flush():
std::cout.flush();
4.7.2. Ввод данных в языке C++
Пример 4.17. Использование объекта cin для суммирования двух целых чисел, введенных пользователем.
#include "stdafx.h"
#include <iostream> // Подключение файла iostream
int main() {
int x = 0, у = 0;
std::cout << "x = "; // Вывод приглашения к вводу
std::cin >> x; // Ввод 1-го числа
std::cout << "y = "; // Вывод приглашения к вводу
std::cin >> у; // Ввод 2-го числа
std::cout << "Summa = " << x + у << std::endl; // Вывод суммы
std::cin.ignore(255, '\n'); // Очистка буфера
Std::cin.get(); // Предотвращение закрытия окна консоли
return 0;
}
Вывести сообщение об ошибке и прервать выполнение программы можно так:
std::cout << "x = "; // Вывод приглашения к вводу
std:: cin >> x; // Ввод значения
if (std::cin.good() == false) { // Проверка ошибки при вводе
std::cout << "Ошибка" << std::endl; // Вывод сообщения
Return 1; // Выход из функции main()
}
Пример 4.18. Обработка ошибок ввода.
#include "stdafx.h"
#include <iostream> // Подключение файла iostream
int main() {
int x = 0, у = 0;
bool flag = false; // Установка флага ошибки
do {
std::cout << "x = "; // Вывод приглашения к вводу
std::cin >> x; // Ввод 1-го числа
if (!std::cin.good()) { // Проверка ошибки при вводе
std::cout << "Ошибка" << std::endl; // Вывод сообщения
Std::cin.clear(); // Сброс флага ошибки
std::cin.ignore(255, '\n'); // Очистка буфера
}
else flag = true; // Ошибки не было
} while (!flag);
flag = false; // Установка флага ошибки
do {
std::cout << "y = "; // Вывод приглашения к вводу
std::cin >> y; // Ввод 2-го числа
if (!std::cin.good()) { // Проверка ошибки при вводе
std::cout << "Ошибка" << std::endl; // Вывод сообщения
Std::cin.clear(); // Сброс флага ошибки
std::cin.ignore(255, '\n'); // Очистка буфера
}
else flag = true; // Ошибки не было
} while (!flag);
std::cout << "Summa = " << x + у << std::endl; // Вывод суммы
std::cin.ignore(255, '\n'); // Очистка буфера
Std::cin.get(); // Предотвращение закрытия окна консоли
return 0;
}
Числа мы вводить научились, теперь попробуем ввести строку.
char str[255]; // Объявление символьного массива
std::cout << "str = "; // Вывод приглашения к вводу
std::cin >> str; // Ввод строки
std::cout << str << std::endl; // Вывод строки
Чтобы строка, включающая несколько слов, вводилась полностью, оператор ввода следует заменить другим:
Std::cin.getline (str, 255); // Ввод строки
Ввод-вывод данных в языке C
Вывод данных в C
В языке C++ вместо файла stdio.h можно подключать файл cstdio:
#include <cstdio>
Для вывода данных используются функции: putchar(), puts() и printf().
Функция putchar() предназначена для вывода одиночного символа, например:
Std::putchar('w'); // w
Std::putchar(119); // w
Функция puts() предназначена для вывода строки. Вывод завершается символом перевода строки. Например:
std::puts("String1");
std::puts("String2");
/* Вывод:
String1
String2
*/
Функция printf() предназначена для форматированного вывода.
Примеры вывода строки и числа:
std::printf("String\n"); // Вывод строки без элементов формата
std::printf("Count %d\n", 10); // Вывод целого числа
std::printf("%s %d\n", "Count", 10); // Вывод строки и целого числа
/* Вывод:
String
Count 10
Count 10
*/
Спецификаторы формата имеют следующий синтаксис:
%[<Модификаторы>][<Ширина>][.<Точность>]<Тип>
Таблица 4.16. <Типы> спецификатора формата
<Тип> спецификатора | Описание |
c | символ |
s | строка |
d или i | десятичное целое число со знаком |
u | десятичное целое число без знака |
o | восьмеричное число без знака |
x или X | шестнадцатеричное число без знака в нижнем или верхнем регистре |
f | вещественное число в десятичном представлении |
e или E | вещественное число в экспоненциальной форме (буква "е" в нижнем или верхнем регистре) |
g или G | эквивалентно f, e или E, выбирается более короткая запись числа |
p | вывод адреса переменной |
% | символ процента (%) |
Примеры:
std::printf("%с", 'w'); // w
std::printf("%с", 119); // w
std::printf("%s", "String"); // String
std::printf("%d %i", 10, -30); // 10 -30
std::printf("%u", 100); // 100
std::printf("%o %o", 10, 077); // 12 77
std::printf("%#o %#o", 10, 077); // 012 077
std::printf("%x %x", 10, 0xff); // a ff
std::printf("%#x %#x", 10, 0xff); // 0xa 0xff
std::printf("%Х %Х", 10, 0xff); // A FF
std::printf("%#Х %#Х", 10, 0xff); // 0XA 0XFF
std::printf{"%f %f", -18.65781452, 12.5); // -18.657815 12.500000
std::printf{"%#.0f %.0f", 100.0, 100.0); // 100. 100
std::printf("%е", 18657.81452); // 1.865781е+004
std::printf("%е", 0.000081452); // 8.145200е-005
std::printf("%Е", 18657.81452); // 1.865781Е+004
std::printf("%g %g %g", 0.086578, 0.000086578, 1.865Е-005);
// 0.086578 8.6578е-005 1.865е-005
std::printf("%G %G %G", 0.086578, 0.000086578, 1.865E-005);
// 0.086578 8.6578E-005 1.865E-005
int x = 10;
std::printf("%p", &x); // 0012FF60
std::printf("%#p", &x); // 0X0012FF60
std::printf("10%%"); // 10%
Параметр спецификатора <Ширина> задает минимальную ширину поля вывода. Например:
std::printf("'%3s'", "string"); // 'string'
std::printf("'%10s'", "string"); // ' string'
std::printf("'%10d'", 25); // ' 25'
std::printf("'%10f'", 12.5); // ' 12.500000'
Вместо минимальной ширины и точности можно указать символ *. В этом случае значения передаются через параметры функции printf() в порядке указания символов в строке формата. Например:
std::printf("'%10.5f'", 3.14159265359); // ' 3.14159'
std::printf("'%.3f'", 3.14159265359); // '3.142'
std::printf("'%7d'", 100); // ' 100'
std::printf("'%.7d'", 100); // '0000100'
std::printf("'%.7d'", 123456789); // '123456789'
std::printf("'%5.7s'", "Hello, world'"); // 'Hello, '
std::printf("'%15.20s'", "Hello, world'"); // ' Hello, world!'
std::printf("'%*.*f'", 10, 5, 3.14159265359); // ' 3.14159'
std::printf("'%.*f'", 3, 3.14159265359); // '3.142'
std::printf("'%*s'", 10, "string"); // ' string'
Таблица 4.17. <Модификаторы> спецификатора формата
<Модификатор> спецификатора | Описание |
# | для восьмеричных значений добавляет в начало символ "0", для шестнадцатеричных значений добавляет комбинацию символов "0х" (если используется тип "x") или "0X" (если используется тип "x"), для вещественных чисел указывает всегда выводить дробную точку, даже если задано значение 0 в параметре <Точность> |
задает наличие ведущих нулей для числового значения | |
– | задает выравнивание по левой границе области, по умолчанию используется выравнивание по правой границе |
пробел | вставляет пробел перед положительным числом, а перед отрицательным числом будет стоять минус |
+ | задает обязательный вывод знака, как для отрицательных, так и для положительных чисел |
h | предназначен для вывода значения переменной, имеющей тип short int |
l (буква "эль") | предназначен для вывода значения переменной, имеющей тип long int. Модификатор l можно использовать совместно с типами c и s, для вывода двухбайтного символа и строки, состоящей из двухбайтных символов соответственно |
L | предназначен для вывода значения переменной, имеющей тип long double |
Примеры:
std::printf("%#o %#о", 10, 077); // 012 077
std::printf("%#x %#x", 10, 0xff); // 0xa 0xff
std::printf("%#X %#X", 10, 0xff); // 0XA 0XFF
std::printf("%#.0f %.0f", 100.0, 100.0); // 100. 100
std::printf("'%7d'", 100); // ' 100'
std::printf("'%07d'", 100); // '0000100'
std::printf("'%5d' '%-5d'", 3, 3); // ' 3' '3
std::printf("'%05d' '%-05d'", 3, 3); // '00003' '3
std::printf("'% d' '% d'", -3, 3); // '-3' ' 3'
std::printf("'%+d' '%+d'", -3, 3); // '-3' '+3'
short int x = 32767;
std::printf("%hd", x); // 32767
long int x = 2147483647;
std::printf("%ld", x); // 2147483647
wchar_t str[] = L"string";
std::printf("%ls", str); // string
long double x = 8е+245;
std::printf("%Le", x); // 8.000000е+245
Ввод данных в языке C
В языке C++ вместо файла stdio.h можно подключать файл cstdio.
#include <cstdio>
Для ввода данных используются функции: getchar(), gets() и scanf().
Функция getchar() предназначена для ввода одиночного символа. Например:
char ch;
std::printf("ch = "); // Вывод приглашения к вводу
ch = std::getchar(); // Ввод одиночного символа
Функция gets() предназначена для ввода строки, однако применять ее в программе не следует, так как функция не производит никакой проверки длины строки, что может привести к переполнению буфера. Лучше получать строку посимвольно с помощью функции getchar().
char line[21]; // Массив на 20 символов + '\0'
std::printf("str = "); // Вывод приглашения к вводу