Оператор ввода в visual studio
Backend-разработка и создание утилит командной строки невозможно без консольного ввода\вывода. В рамках данной статьи будут рассмотрены методы класса Console для чтения и записи информации в консоль.
Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.
Консольный ввод\вывод
Класс Console. Вывод данных в консоль
Класс Console содержит методы для работы с консольным вводом\выводом, управлением потоком с ошибками и окном консоли. Начнем с вывода информации в консоль, для решения этой задачи класс Console предоставляет два метода: Write и WriteLine.
Для знакомства с методами класса Console создайте в удобном для вас каталоге проект с именем CSharpLesson3:
Метод Write
Метод Write – направляет в стандартный выходной поток текстовое представление переданного в него объекта. Дополнительно, предоставляет возможность задать форматирование.
Откройте файл Program.cs в созданном ранее проекте и добавьте в метод Main следующие строки, демонстрирующие работу с методом Write:
Более подробно про форматирование будет написано в уроке, посвященном работе со строками.
Сохраните документ, откройте консоль, перейдите в каталог с проектом и выполните команду:
Результат работы программы будет выглядеть примерно следующим образом:
Обратите внимание на первые три вызова метода Write, если не поставить символ перевода строки, то данные будут выдаваться в одну строку друг за другом, это не всегда удобно. Если требуется, чтобы вывод каждый раз осуществлялся с новой строки, то воспользуйтесь методом WriteLine.
Метод WriteLine
Метод WriteLine записывает указанные данные в выходной поток и добавляет символ перевода строки. Добавьте в программу следующие строки:
Теперь надпись “Текущая дата:” и дата со временем будут выведены в разных строках.
WriteLine (также как Write) может принимать не только строковые значения, но и переменные разных типов:
Удобным и наглядным способом вывода значений переменных в консоль с дополнительным текстовым пояснением является использование строковой интерполяции:
Запустите проект и в консоли увидите результат выполнения программы:
Прием интерполяции позволяет внутри строки, используя фигурные скобки, указывать имена переменных, которые будут заменены значениями. Перед такой строкой ставится знак $.
Методы WriteLine и Write позволяют использовать форматирование:
В этом случае методу передается ряд параметров, первый – это строка, в которой, в фигурных скобках, указывается порядок подстановки значений переменных, далее, через запятую, перечисляются переменные, значения которых нужно подставить, здесь важен порядок: нумерация начинается с 0.
Класс Console. Чтение данных из консоли
В классе Console, помимо рассмотренных выше методов вывода в консоль, присутствуют методы для считывания вводимых данных из консоли.
Метод Read
Метод Read возвращает числовой код последнего введенного символа во входном потоке, если символ введен не был, то будет возвращен код -1. Для завершения работы метода, после ввода символа необходимо нажать клавишу “Enter”. Рассмотрим работу с методом Read на примере:
Если после надписи “Нажмите любую клавишу, а затем Enter” будет введено более одного символа, то Read вернет только первый.
Для представления кода в виде символа необходимо переменную key1 привести к типу Char, для этого можно воспользоваться методом Convert.ToChar().
Метод ReadLine
Метод ReadLine возвращает введенную строку символов до нажатия клавиши “Enter”. Добавим несколько строк в файл с исходным кодом, для демонстрации работы с методом ReadLine :
Если необходимо получить с консоли численные данные, то следует воспользоваться методами из класса Convert для приведения типа String к соответствующему числовому типу:
Метод ReadKey
ReadKey возвращает объект класса ConsoleKeyInfo, в который помещается информация о нажатой клавише. Этот метод, как правило, используют для остановки выполнения программы или чтобы получить ответ от пользователя. Добавим строки для работы с ReadKey:
Исходный код примеров из этой статьи можете скачать из нашего github-репозитория.
В следующих разделах показано использование классов, System.IO определенных в пространстве имен, для выполнения различных файловых операций.
Перечислить файлы в каталоге
В следующем примере кода показано, как получить список файлов в каталоге. Кроме того, перечисляются подкаталоги. в следующем примере кода методы и GetDirectories используются GetFilesGetFiles для вывода содержимого каталога C:\ Windows.
Пример
Мониторинг изменений файловой системы
В следующем примере кода используется FileSystemWatcher для регистрации событий, соответствующих создаваемым, изменяемым, удаляемым или переименованным файлам. Вместо периодического опроса каталога на наличие изменений в файлах можно использовать FileSystemWatcher класс для запуска событий при обнаружении изменений.
Пример
Чтение двоичного файла
В следующем примере кода показано, как считывать двоичные данные из файла с помощью двух классов из System.IO пространства имен: FileStream и BinaryReader . FileStream представляет фактический файл. BinaryReader предоставляет интерфейс для потока, который обеспечивает двоичный доступ.
Пример кода считывает файл с именем Data. bin и содержит целые числа в двоичном формате. Сведения об этом типе файлов см. в разделе как записать двоичный файл (C++/CLI).
Пример
Чтение текстового файла
В следующем примере кода показано, как открыть и прочитать текстовый файл по одной строке за раз с помощью StreamReader класса, определенного в System.IO пространстве имен. Экземпляр этого класса используется для открытия текстового файла, а затем System.IO.StreamReader.ReadLine метод используется для получения каждой строки.
Этот пример кода считывает файл с именем textfile.txt и содержит текст. Сведения об этом типе файлов см. в разделе как написать текстовый файл (C++/CLI).
Пример
Получение сведений о файле
В следующем примере кода показан FileInfo класс. При наличии имени файла этот класс можно использовать для получения сведений о файле, таких как размер файла, каталог, полное имя, Дата и время создания и последнего изменения.
Этот код извлекает сведения о файле для Notepad.exe.
Пример
Запись двоичного файла
В следующем примере кода демонстрируется запись двоичных данных в файл. Используются два класса из System.IO пространства имен: FileStream и BinaryWriter . FileStream представляет фактический файл, а BinaryWriter предоставляет интерфейс для потока, который обеспечивает двоичный доступ.
В следующем примере кода записывается файл, содержащий целые числа в двоичном формате. Этот файл можно прочитать с помощью кода в статье как прочитать двоичный файл (C++/CLI).
Пример
Запись текстового файла
В следующем примере кода показано, как создать текстовый файл и записать в него текст с помощью StreamWriter класса, который определен в System.IO пространстве имен. StreamWriterКонструктор принимает имя создаваемого файла. Если файл существует, он перезаписывается (если не передается значение true в качестве второго StringWriter аргумента конструктора).
Для вывода информации на консоль мы уже использовали встроенный метод Console.WriteLine . То есть, если мы хотим вывести некоторую информацию на консоль, то нам надо передать ее в метод Console.WriteLine:
Нередко возникает необходимость вывести на консоль в одной строке значения сразу нескольких переменных. В этом случае мы можем использовать прием, который называется интерполяцией:
Для встраивания отдельных значений в выводимую на консоль строку используются фигурные скобки, в которые заключается встраиваемое значение. Это можем значение переменной ( ) или более сложное выражение (например, операция сложения ). А перед всей строкой ставится знак доллара $.
При выводе на консоль вместо помещенных в фигурные скобки выражений будут выводиться их значения:
Есть другой способ вывода на консоль сразу нескольких значений:
Здесь мы видим, что строка в Console.WriteLine содержит некие числа в фигурных скобках: , , . Это плейсхолдеры, вместо которых при выводе строки на консоль будут подставляться некоторые значения. Подставляемые значения указываются после строки через запятую.
При этом важен порядок подобных плейсхолдеров. Например, в данном случае после строки первой указана переменная name, потом height и потом age. Поэтому значение переменной name будет всавляться вместо первого плейсхолдера - (нумерация начинается с нуля), height - вместо , а age - вместо . Поэтому в итоге пи выводе на консоль строка
будет заменена на
Console.Write
Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не добавляет переход на следующую строку, то есть последующий консольный вывод будет выводиться на той же строке.
Консольный ввод
Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.
В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine() передается в переменную name.
Пример работы программы:
Особенностью метода Console.ReadLine() является то, что он может считать информацию с консоли только в виде строки. Кроме того, возможная ситуация, когда для метода Console.ReadLine не окажется доступных для считывания строк, то есть когда ему нечего считывать, он возвращаает значение null , то есть, грубо говоря, фактически отсутствие значения. И чтобы отразить эту ситуацию мы определяем переменную name , в которую получаем ввод с консоли, как переменную типа string? . Здесь string указывает, что переменная может хранить значения типа string, то есть строки. А знак вопроса ? указывает, что переменная также может хранить значение null , то есть по сути не иметь никакого значения. Далее мы более подробно разберем null и как с ним работать.
Convert.ToInt32() (преобразует к типу int)
Convert.ToDouble() (преобразует к типу double)
Convert.ToDecimal() (преобразует к типу decimal)
Пример ввода значений:
При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания. ), в других - запятая (Россия, Германия. ). Например, если текущая ОС - русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.
По умолчанию язык C++ не содержит встроенных средств для ввода с консоли и вывода на консоль, эти средства предоставляются библиотекой iostream . В ней определены два типа: istream и ostream . istream представляет поток ввода, а ostream - поток вывода.
Вобще сам темин "поток" в данном случае представляет последовательность символов, которая записывается на устройство ввода-вывода или считывается с него. И в данном случае под устройством ввода-вывода рассматривается консоль.
Для записи или вывода символов на консоль применяется объект cout , который представляет тип ostream. А для чтения с консоли используется объект cin
Для использования этих объектов в начало исходного файла необходимо подключить библиотеку iostream:
Вывод на консоль
Консольный вывод программы:
Строки могут содержать управляющие последовательности, которые интерпретируются определенным образом. Например, последовательность "\n" интерпретируется как перевод на новую строку. Из других управляющих последовательностей также нередко употребляется "\t", которая интерпретируется как табуляция.
Ввод с консоли
Для считывания с консоли данных применяется оператор ввода >> , который принимает два операнда. Левый операнд представляет объект типа istream (в данном случае объект cin), с которого производится считывание, а правый операнд - объект, в который считываются данные.
Например, считаем данные с консоли:
Здесь после приглашений к вводу программа ожидает ввода значений для переменных age и weight.
Пример работы программы:
Стоит отметить, что так оператор ввода в первом случае будет добавлять данные в целочисленную переменную age, то он ожидает ввода числа. В случае с переменной weight оператор ввода ожидает дробное число, причем разделителем целой и дробной части должна быть точка. Поэтому мы не можем ввести любые значения, например, строки. В этом случае программа может выдать некорректный результат.
Оператор ввода >> возвращает левый операнд - объект cin, поэтому мы можем по цепочке считывать данные в различные переменные:
Пример работы программы:
После ввода одного из значений надо будет ввести пробел и затем вводить следующее значение.
Второй параметр оператора определяется как ссылка на константу объекта класса, который надо вывести в поток.
Для совместимости с другими операторами переопределяемый оператор должен возвращать значение параметра ostream.
Также следует отметить, что операторы ввода и вывода не должны быть членами в классе, а определяются вне класса как обычные функции.
В данном случае оператор вывода определяется для объектов структуры Person. Сам оператор по сути просто выводит имя и возраст пользователя через пробел:
Оператор >>
Первый параметр оператора >> , как правило, представляет ссылку на объект istream, с которого осуществляется чтение. Второй параметр представляет ссылку на неконстантный объект, в который надо считать данные.
Обычно в качестве результата операторы возвращают ссылку на поток ввода istream из первого параметра.
Оператор ввода последовательно считывает из потока имя и возраст пользователя. При этом в данном случае предполагается, что имя представляет одно слово. Если стоит задача, считать сложное имя, которые состоит из нескольких слов, или имя и фамилию, то естественно надо определять более сложную логику.
Пример работы программы:
Однако что если мы введем для возраста вместо числа строку? В этом случае переменная age получит неопределенное значение. Существуют различные варианты, как обрабатывать подобные ситуации. Но в качестве примера мы можем в случае некорректного ввода устанавливать значение по умолчанию:
С помощью выражения if(!is) проверяем, является ли ввод неудачным. Если он неудачен, то используем конструктор без параметров для создания объекта.
Чтение и запись файла
Определив операторы ввода и выводы, мы можем их использовать также и для чтения и записи файла:
Здесь для класса Person определены операторы ввода и вывода. С помощью оператора вывода данные будут записываться в файл users.txt, а с помощью оператора ввода - считываться из файла. В конце считанные данные выводятся на консоль:
Читайте также: