Программирование консольного ввода вывода
Для вывода информации на консоль мы уже использовали встроенный метод Console.WriteLine . То есть, если мы хотим вывести некоторую информацию на консоль, то нам надо передать ее в метод Console.WriteLine:
string hello = "Привет мир"; Console.WriteLine(hello); Console.WriteLine("Добро пожаловать в C#!"); Console.WriteLine("Пока мир. "); Console.WriteLine(24.5);
Привет мир! Добро пожаловать в C#! Пока мир. 24,5
Нередко возникает необходимость вывести на консоль в одной строке значения сразу нескольких переменных. В этом случае мы можем использовать прием, который называется интерполяцией:
string name = "Tom"; int age = 34; double height = 1.7; Console.WriteLine($"Имя: Возраст: Рост: м");
Для встраивания отдельных значений в выводимую на консоль строку используются фигурные скобки, в которые заключается встраиваемое значение. Это можем значение переменной ( ) или более сложное выражение (например, операция сложения ). А перед всей строкой ставится знак доллара $.
При выводе на консоль вместо помещенных в фигурные скобки выражений будут выводиться их значения:
Имя: Tom Возраст: 34 Рост: 1,7м
Есть другой способ вывода на консоль сразу нескольких значений:
string name = "Tom"; int age = 34; double height = 1.7; Console.WriteLine("Имя: Возраст: Рост: м", name, height, age);
Здесь мы видим, что строка в Console.WriteLine содержит некие числа в фигурных скобках: , , . Это плейсхолдеры, вместо которых при выводе строки на консоль будут подставляться некоторые значения. Подставляемые значения указываются после строки через запятую.
При этом важен порядок подобных плейсхолдеров. Например, в данном случае после строки первой указана переменная name, потом height и потом age. Поэтому значение переменной name будет вставляться вместо первого плейсхолдера — (нумерация начинается с нуля), height — вместо , а age — вместо . Поэтому в итоге пи выводе на консоль строка
"Имя: Tom Возраст: 34 Рост: 1,7м"
Console.Write
Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не добавляет переход на следующую строку, то есть последующий консольный вывод будет выводиться на той же строке.
string name = "Tom"; int age = 34; double height = 1.7; Console.Write($"Имя: Возраст: Рост: м");
Консольный ввод
Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.
Console.Write("Введите свое имя: "); string? name = Console.ReadLine(); Console.WriteLine($"Привет ");
В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine() передается в переменную name.
Введите свое имя: Том Привет Том
Особенностью метода Console.ReadLine() является то, что он может считать информацию с консоли только в виде строки. Кроме того, возможная ситуация, когда для метода Console.ReadLine не окажется доступных для считывания строк, то есть когда ему нечего считывать, он возвращаает значение null , то есть, грубо говоря, фактически отсутствие значения. И чтобы отразить эту ситуацию мы определяем переменную name , в которую получаем ввод с консоли, как переменную типа string? . Здесь string указывает, что переменная может хранить значения типа string, то есть строки. А знак вопроса ? указывает, что переменная также может хранить значение null , то есть по сути не иметь никакого значения. Далее мы более подробно разберем null и как с ним работать.
Однако, может возникнуть вопрос, как нам быть, если, допустим, мы хотим ввести возраст в переменную типа int или другую информацию в переменные типа double или decimal? По умолчанию платформа .NET предоставляет ряд методов, которые позволяют преобразовать различные значения к типам int, double и т.д. Некоторые из этих методов:
- Convert.ToInt32() (преобразует к типу int)
- Convert.ToDouble() (преобразует к типу double)
- Convert.ToDecimal() (преобразует к типу decimal)
Console.Write("Введите имя: "); string? name = Console.ReadLine(); Console.Write("Введите возраст: "); int age = Convert.ToInt32(Console.ReadLine()); Console.Write("Введите рост: "); double height = Convert.ToDouble(Console.ReadLine()); Console.Write("Введите размер зарплаты: "); decimal salary = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine($"Имя: Возраст: Рост: м Зарплата: $");
При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания. ), в других — запятая (Россия, Германия. ). Например, если текущая ОС — русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.
Введите имя: Том Введите возраст: 25 Введите рост: 1,75 Введите размер зарплаты: 300,67 Имя: Том Возраст: 25 Рост: 1,75м Зарплата: 300,67$
Программирование консольного ввода вывода
По умолчанию язык C++ не содержит встроенных средств для ввода с консоли и вывода на консоль, эти средства предоставляются библиотекой iostream . В ней определены два типа: istream и ostream . istream представляет поток ввода, а ostream — поток вывода.
Вообще, сам термин «поток» в данном случае представляет последовательность символов, которая записывается на устройство ввода-вывода или считывается с него. И в данном случае под устройством ввода-вывода рассматривается консоль.
Для записи или вывода символов на консоль применяется объект cout , который представляет тип ostream. А для чтения с консоли используется объект cin
Для использования этих объектов в начало исходного файла необходимо подключить библиотеку iostream:
Вывод на консоль
#include int main() < int age ; double weight ; std::cout
Консольный вывод программы:
Name: Tom Age: 33 Weight: 81.23
Строки могут содержать управляющие последовательности, которые интерпретируются определенным образом. Например, последовательность «\n» интерпретируется как перевод на новую строку. Из других управляющих последовательностей также нередко употребляется «\t», которая интерпретируется как табуляция.
Ввод с консоли
Для считывания с консоли данных применяется оператор ввода >> , который принимает два операнда. Левый операнд представляет объект типа istream (в данном случае объект cin), с которого производится считывание, а правый операнд — объект, в который считываются данные.
Например, считаем данные с консоли:
#include int main() < int age; double weight; std::cout > age; std::cout > weight; std::cout
Здесь после приглашений к вводу программа ожидает ввода значений для переменных age и weight.
Input age: 32 Input weight: 67.45 Age: 32 Weight: 67.45
Стоит отметить, что так как оператор ввода в первом случае будет добавлять данные в целочисленную переменную age, то он ожидает ввода числа. В случае с переменной weight оператор ввода ожидает число с плавающей точкой, причем разделителем целой и дробной части должна быть точка. Поэтому мы не можем ввести любые значения, например, строки. В этом случае программа может выдать некорректный результат.
Оператор ввода >> возвращает левый операнд — объект cin, поэтому мы можем по цепочке считывать данные в различные переменные:
#include int main() < int age; double weight; std::cout > age >> weight; std::cout
Input age and weight: 32 67.45 Age: 32 Weight: 67.45
После ввода одного из значений надо будет ввести пробел и затем вводить следующее значение.
Ввод-вывод на консоль и порт
Эти процедуры выполняют чтение и запись для консоли или порта с определенным номером. Процедуры ввода-вывода консоли несовместимы с подпрограммами потокового ввода-вывода или низкоуровневой библиотеки ввода-вывода. Консоль или порт не нужно открывать или закрывать перед выполнением операций ввода-вывода, поэтому в этой категории нет процедур открытия или закрытия. В операционных системах Windows выходные данные этих функций всегда направляются в консоль и не могут быть перенаправлены.
Процедуры ввода-вывода для консоли и порта
Подпрограмма | Использование |
---|---|
_cgets , _cgetws , _cgets_s , _cgetws_s | Считывание строки из консоли |
_cprintf , _cwprintf , _cprintf_s , _cprintf_s_l , _cwprintf_s , _cwprintf_s_l | Вывод форматированных данных на консоль |
_cputs | Вывод строки на консоль |
_cscanf , _cwscanf , _cscanf_s , _cscanf_s_l , _cwscanf_s , _cwscanf_s_l | Считывание форматированных данных из консоли |
_getch , _getwch | Считывание символа из консоли |
_getche , _getwche | Считывание и отображение символа из консоли |
_inp | Чтение байта из указанного порта ввода-вывода |
_inpd | Считывание двойного слова из указанного порта ввода-вывода |
_inpw | Считывание двухбайтового слова из указанного порта ввода-вывода |
_kbhit | Проверка нажатия клавиш в консоли, которую следует выполнять перед попыткой чтения из консоли |
_outp | Запись байта в указанный порт ввода-вывода |
_outpd | Запись двойного слова в указанный порт ввода-вывода |
_outpw | Запись слова в указанный порт ввода-вывода |
_putch , _putwch | Запись символа в консоль |
_ungetch , _ungetwch | «Отмена чтения» последнего символа, полученного из консоли, чтобы он стал следующим символом для считывания |
Методы ввода и вывода
Существует два разных подхода к консольному вводу-выводу, выбор которых зависит от гибкости и контроля, необходимых приложению. Высокоуровневый подход обеспечивает простой ввод-вывод потока символов, но ограничивает доступ к входным и экранным буферам консоли. Низкоуровневый подход требует, чтобы разработчики писали больше кода и выбирайте один из более широких наборов функций, но он также дает приложению большую гибкость.
Низкоуровневый подход не рекомендуется для новых и текущих разработок. Приложениям, нуждающимся в функциональных возможностях низкоуровневых функций ввода-вывода консоли, рекомендуется использовать последовательности виртуальных терминалов и изучить нашу документацию по классическим функциям, а также по виртуальному терминалу и стратегии развития экосистемы.
Приложение может использовать функции файлового ввода-вывода ReadFile и WriteFile, а также консольные функции ReadConsole и WriteConsole для высокоуровневых операций ввода-вывода, которые обеспечивают косвенный доступ к входным и экранным буферам консоли. Высокоуровневые входные функции фильтруют и обрабатывают данные во входном буфере консоли, чтобы вернуть входные данные в виде потока символов, отбрасываемые мышью и изменяя размер буфера. Аналогичным образом высокоуровневые выходные функции записывают поток символов, отображаемых в текущем расположении курсора в буфере экрана. Приложение управляет тем, как работают эти функции, задавая режимы ввода-вывода консоли.
Низкоуровневые функции ввода-вывода обеспечивают прямой доступ к входным и экранным буферам консоли, позволяя приложению получать доступ к событиям ввода мыши и изменения размера буфера и расширенным сведениям о событиях клавиатуры. Низкоуровневые выходные функции позволяют приложению выполнять чтение или запись в указанное число последовательных символьных ячеек в буфере экрана, а также считывать или записывать в прямоугольные блоки символьных ячеек в указанном расположении в буфере экрана. Режимы ввода консоли влияют на низкоуровневые входные данные, позволяя приложению определить, помещаются ли события изменения размера мыши и буфера во входной буфер. Режимы вывода консоли не влияют на низкоуровневые выходные данные.
Высокоуровневые и низкоуровневые методы ввода-вывода не являются взаимоисключающими, и приложение может использовать любое сочетание этих функций. Обычно, однако, приложение использует только один или другой подход, и мы рекомендуем сосредоточиться на одной конкретной парадигме для достижения оптимальных результатов.
Идеальное приложение, ориентированное на перспективу, будет сосредоточено на высокоуровневых методах и дополнит дальнейшие потребности с помощью последовательностей виртуальных терминалов с помощью высокоуровневых методов ввода-вывода, когда это необходимо, чтобы полностью избежать использования низкоуровневых функций ввода-вывода.
В следующих разделах описаны режимы консоли, а также высокоуровневые и низкоуровневые функции ввода-вывода.
- Консольные режимы
- Высокоуровневый ввод-вывод консоли
- Режимы высокоуровневой консоли
- Высокоуровневые функции ввода и вывода консоли
- Последовательности виртуального терминала в консоли
- Классические функции и последовательности виртуальных терминалов
- Стратегия развития экосистемы
- Низкоуровневый ввод-вывод консоли
- Режимы низкоуровневой консоли
- Низкоуровневые входные функции консоли
- Функции вывода низкоуровневой консоли