0

Ввод и вывод данных в консольном режиме

Для вывода данных в консольном режиме используется функция из пакета System. Этот пакет автоматически подключается любым компилятором Java.

ü System.out.print(объект)- выводит строку текста на экран, курсор остается на текущей строке;

ü System.out.println(объект) – выводит строку теста, курсор переходит на следующую строку;

С вводом информации с клавиатуры дело обстоит сложнее, поскольку системный пакет имеет только объект связанный с потоком ввода. Для того, чтобы ввести информацию с клавиатуры нам необходимо связать этот объект с объектом выполняющим чтение потока. Для этого необходимо подключить класс java.io.InputStreamReader, который обеспечивает преобразование данных потока в текстовую информацию. Вся работа с файлами и потоками ввода вывода в случае ошибки генерирует так называемые исключительные ситуации для обработки которых необходимо подключить класс обработчик исключений ввода-вывода java.io.IOException.

Наиболее простым в примером ввода информации с клавиатуры является ввод строки текста. Пример программного кода имеет следующий вид:

// Объявляем переменную в которой будет помещен

// результат ввода информации

// Определяем блок обработки исключительных ситуаций

// Объявляем и создаем объект преобразования данных потока

// В текстовой вид

InputStreamReader is=new InputStreamReader(System.in);

// Объявляем текстовой буфер, длина которого соответствует

// максимальной длине строки.

char buf[] = new char[128];

// После этого в этот буфер производим чтение

// Этот буфер мы преобразовываем к строке

// После этого закрываем блок обработки исключительных ситуаций.

// И описываем поведение системы в случае возникновения

// ошибки при чтении данных

catch (IO Exception e) <

Для ввода числовой информации также необходимо сначала получить строку текста, после чего с помощью класса преобразователя преобразуется к значению числового типа. Для исполнения данной операции необходимо подключить библиотеку обработки ошибок преобразования чисел java.lang.NumbericFormatException и класс – оболочку типа данных, к которой необходимо преобразовать java.lang.Double;

// Объявляем переменную в которой будет помещен

// результат ввода информации

// Определяем блок обработки исключительных ситуаций

// Объявляем и создаем объект преобразования данных потока

// В текстовой вид

InputStreamReader is = new InputStreamReader(System.in);

// Объявляем текстовой буфер, длина которого соответствует

// максимальной длине строки.

char buf[] = new char[128];

// После этого в этот буфер производим чтение

//преобразовываем к вещественному типу

// После этого закрываем блок обработки исключительных ситуаций.

// описываем поведение системы в случае возникновения

// ошибки при чтении данных

catch (IOException e)<

// описываем поведение системы в случае возникновения

// ошибки при преобразовании текстовых данных в

catch (NumbericFormatException e1) <

Поскольку чтение данных с клавиатуры, является достаточно часто используемой операцией, то для удобства в программе обычно создают функции для операций, которые выполняются неоднократно. Рассмотрим это на примере:

// создаем функцию чтения строки

public String read_str() <

// Объявляем переменную в которой будет помещен

// результат ввода информации

// Определяем блок обработки исключительных ситуаций

// Объявляем и создаем объект преобразования данных потока

// В текстовой вид

InputStreamReader is=new InputStreamReader(System.in);

// Объявляем текстовой буфер, длина которого соответствует

// максимальной длине строки.

char buf[] = new char[128];

// После этого в этот буфер производим чтение

// Этот буфер мы преобразовываем к строке

Читайте также:  Вирусы в социальных сетях

// После этого закрываем блок обработки исключительных ситуаций.

// И описываем поведение системы в случае возникновения

// ошибки при чтении данных

catch (IO Exception e) <

if (a = = null) return “”;

// и функцию чтения вещественного числа

public double read_double() <

// Объявляем переменную в которой будет помещен

// результат ввода информации

// Определяем блок обработки исключительных ситуаций

// И описываем поведение системы в случае возникновения

При запуске программы на Си автоматически открываются пять потоков, основными из которых являются следующие:

Стандартный поток ввода stdin

Стандартный поток вывода stdout

Стандартный поток вывода сообщений об ошибках stderr

Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr – экрану монитора.

Для управления вводом-выводом с помощью этих потоков используются ряд функций:

getchar() : ввод с клавиатуры одного символа

putchar() : вывод на консоль одного символа

gets() : ввод одной строки

puts() : вывод одной строки на консоль

scanf() : ввод с форматированием данных

printf() : вывод с форматированием данных

Функции printf и scanf уже рассматиривались ранее, поэтому посмотрим, как применять остальные функции.

Ввод и вывод символов

Для ввода одного символа с клавиатуры применяется функция getchar() , которая имеет следующий прототип:

В качестве результата функция возвращает числовой код введенного символа.

Для вывода отдельного символа на консоль предназначена функция putchar() со следующим прототипом:

Выводимый символ в виде числового кода передается в putchar в качестве параметра, он же возвращается функцией.

Следует сказать, что на самом деле функции getchar() и putchar() полноценными функциями не являются, а определены как макросы в заголовочном файле stdio.h :

При использовании функции getchar следует учитывать, что при печати текста посредством клавиатуры в буфер операционной системы заносятся коды печатаемых символов, а сами символы отображаются на экране. Поучение программой введенного символа из буфера производится с помощью нажатия клавиши Enter.

И если буфер операционной системы не пуст, то при вызове функции getc() она получает очередной символ из буфера. Если же буфер пуст, то происходит чтение байта из потока ввода с помощью системной функции, название которой зависит от операционной системы.

При этом при нажатии клавиши Enter, в буфер также помещается код этой клавиши. То есть если мы введем один символ и нажмем на Enter, в буфере окажутся два числовых кода – введенного символа и клавиши Enter. И это надо учитывать при работе с функцией getchar. В частости, рассмотрим простой, но показательный пример:

Сначала на экран выводится цифра 1, после чего функция getchar ожидает ввода символа. Если после ввода символа мы нажмем Enter, то в буфер будет помещены два числовых кода – введеного символа и клавиши Enter. Поэтому при втором вызове getchar эта функция считывает байт из буфера – то есть числовой код клавиши Enter.

Например, введем при первом вызове функции getchar символ "a", а затем Enter:

Но если при каждом вызове getchar мы будем только нажимать клавишу Enter, тогда в буфер будет заноситься только код этой клавиши, и соответственно программа будет работать, как и ожидалось:

Применим функции getchar и putchar для ввода и вывода символов с клавиатуры:

Функция getchar считывает числовой код символа, который потом выводится в функции putchar. Для вывода из программы необходимо ввести комбинацию клавиш Ctrl+C.

Читайте также:  В гарене не вижу хост друга

Ввод и вывод строк

Для ввода строки с клавиатуры применяется функция gets() , которая имеет следующий прототип:

Вводимые данные помещаются в массив, на который указывает указатель *s, передаваемый в функцию в качестве параметра. При успешном прочтении строки функция возвращает адрес этого массива s. А в случае ошибки возвращается значение NULL .

При вводе символов функция gets() завершает свою работу при вводе символа ‘
‘, то есть при нажатии на клавишу Enter. Но вместо этого символа в строку записывается нулевой символ ‘’, который и будет указывать на завершение строки.

Для вывода одной строки на консоль предназначена функция puts() со следующим прототипом:

В качестве параметра передается указатель на строку, а возвращаемым результатом функции является последний выведенный символ.

При этом функция puts() будет выводить символы переданной строки, пока не дойдет до нулевого символа ‘’. Если же выводимый массив символов не содержит этого символа, то результат программы неопределен.

Приложение, написанное на любом языке программирования, должно взаимодействовать с окружающим миром. Иначе пользы от него не будет. Как правило, такое взаимодействие осуществляется посредством ввода-вывода информации на монитор или в файл. Правда, есть некоторое множество программ, которые не используют файловый или консольный ввод-вывод: это программы, осуществляющие низкоуровневое взаимодействие с аппаратной частью компьютера и периферией (ядро ОС, драйверы и пр.), но это уже экзотика.

В стандартном C++ существует два основных пути ввода-вывода информации: с помощью потоков, реализованных в STL (Standard Template Library) и посредством традиционной системы ввода-вывода, унаследованной от C. Если копнуть немного глубже, то окажется, что и потоки, и традиционная система ввода-вывода для осуществления необходимых действий используют вызовы операционной системы. И это правильно.

Дальнейшее изложение не претендует на полноту, но описывает основные принципы использования библиотек. Подробности использования можно посмотреть в многочисленной литературе по C++ и STL, в MSDN и пр.

Традиционный ввод-вывод

Для использования традиционного ввода-вывода в духе C, в программу необходимо включить заголовочный файл . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)

Библиотека stdio предоставляет необходимый набор функций для ввода и вывода информации как в текстовом, так и в двоичном представлении. Следует отметить, что в отличие от классической C‑библиотеки, в современных библиотеках имеются более безопасные аналоги «классических» функций. Как правило, они имеют такое же имя, к которому добавлен суффикс _s. Рекомендуется использовать именно эти, безопасные функции.

Самая Первая Программа с использованием библиотеки stdio выглядит так:

При запуске консольного приложения неявно открываются три потока: stdin — для ввода с клавиатуры, stdout — для буферизованного вывода на монитор и stderr — для небуферизованного вывода на монитор сообщений об ошибках. Эти три символа определены посредством .

В stdio для консольного ввода-вывода предусмотрена отдельная группа функций. Однако эти функции, как правило, являются обёртками для аналогичных функций файлового ввода-вывода, для которых аргумент типа FILE задан по умолчанию.

Самая Первая Программа с использование файлового вывода из библиотеки stdio выглядит так:

Некоторые популярные функции из stdio:

Сущность FILE представляет собой структуру, в которой хранится вся информация для управления потоком ввода-вывода.

Файл открывается функцией fopen(), которой передаются два параметра. Первый параметр определяет имя файла. Второй — определяет режим открытия файла: чтение, запись, произвольный доступ и т.п., а также указание на то, как работать с данными: в текстовом или двоичном режиме. Подробности — см. в документации.

Читайте также:  Зависают танки что делать

Пример использования stdio

Следует отметить, что существует еще одна библиотека, ориентированная исключительно на консольный ввод-вывод — .

Ввод-вывод с помощью потоков STL

Для использования объектно-ориентированного консольного ввода-вывода с помощью потоков (stream) STL в программу необходимо включить заголовочный файл , а для файлового ещё и . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)

Самая Первая Программа с использованием потоков STL выглядит так:

При запуске консольного приложения неявно открываются четыре потока: сin — для ввода с клавиатуры, сout — для буферизованного вывода на монитор, сerr — для небуферизованного вывода на монитор сообщений об ошибках и clog — буферизованный аналог cerr. Эти четыре символа определены посредством .

Потоки cin, cout и cerr соответствуют потокам stdin, stdout и stderr соответственно.

Иерархия классов ввода-вывода STL достаточно сложна. Любители тонких ощущений могут найти её описание в литературе. Впрочем, остальных также не минует чаша сия, но только позже, когда потребуются знания чуть повыше того базового уровня, который описывается здесь.

Для ввода-вывода сначала необходимо создать поток — экземпляр соответствующего класса STL, а затем связать его с файлом. Для потока вывода используется класс ofstream, для потока ввода — ifstream, для потока ввода-вывода — fstream. В каждом из этих классов есть метод open(), который связывает поток с файлом. Проще говоря, открывает файл. Методу передаются два параметра: имя файла и режим открытия файла. Второй параметр представляет собой набор битовых флагов, определяющих режим открытия файла (чтение, запись и пр.) и способ работы с данными (текстовый или двоичный режим). Второй параметр опционален, т.е. имеет значение по умолчанию, соответствующее классу.

Вышеупомянутые классы имеют также конструкторы, позволяющие открыть файл сразу при создании потока. Параметры этих конструкторов полностью совпадают с параметрами метода open().

При ошибке открытия файла (в контексте логического выражения) поток получает значение false.

Файл закрывается методом close(). Этот метод также вызывается при разрушении экземпляров классов потоков.

Операции чтения и записи в поток, связанный с файлом, осуществляются либо с помощью операторов >, перегруженных для классов потоков ввода-вывода, либо с помощью любых других методов классов потоков ввода-вывода.

Некоторые наиболее употребляемые методы:

Пример использования потоков STL

Взаимодействие потокового и традиционного ввода-вывода

Апологеты C++ рекомендуют использовать для ввода-вывода только потоки STL и отказаться от использования традиционного ввода-вывода в духе C. Однако, ничто не мешает, по крайней мере пока, использовать традиционную систему ввода-вывода. Более того, предусмотрена специальная функция для синхронизации ввода-вывода, выполненного посредством потоков и посредством старых функций.

Заключение

Какой механизм использовать — вопрос предпочтений программиста, если работодателем явно не предписано использование конкретного механизма. В любом случае для физического ввода-вывода используются вызовы операционной системы. Всё остальное — обёртка, набор более или менее удобных функций или классов для взаимодействия с ОС.

Использование механизма потоков считается более безопасным. Но, как известно, плохую программу можно написать на любом языке программирования. Это также относится и к использованию библиотек. Автор статьи: Череп.

admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *