Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Стандартные объекты ввода-вывода



 

При запуске программы, включающей классы iostreams, создаются и инициируются четыре объекта.

 

Примечание: Библиотека класса iostream встроена в компилятор. Чтобы добавить в свою программу методы этого класса, достаточно в первых строках программы включить выражение #include< iostream>.

 

• Объект cin (произносится как " си-ин" от английского " see-in" ) обрабатывает ввод с клавиатуры.

• Объект cout (произносится как " си-аут" от английского " see-out" ) обрабатывает вывод на экран.

• Объект cerr (произносится как " си-эр" от английского " see-err" ) обрабатывает не буферизированный вывод ошибок на стандартное устройство вывода сообщений об ошибках, т.е. на экран. Поскольку вывод не буферизированный, то все данные, направляемые в c err, сразу же выводятся устройством вывода.

• Объект clog (произносится как " си-лог" от английского " see-log" ) обрабатывает буферизированные сообщения об ошибках, которые выводятся на стандартное устройство вывода сообщений об ошибках (экран). Зачастую эти сообщения переадресуются в файл регистрации. Об этом вы узнаете далее в главе.

Переадресация

 

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

Под переадресацией понимают пересылку выводимых данных в устройство, либо считывание данных с устройства, отличное от установленного по умолчанию. В операционных системах DOS и UNIX используются специальные операторы переадресации ввода (< ) и вывода (> ).

Пайпингом называется использование вывода одной программы в качестве ввода для другой.

Операционная система DOS содержит ограниченный набор команд переадресации для вывода (> ) и ввода (< ). Команды переадресации системы UNIX более разнообразны, однако основная идея остается той же: данные выводятся на экран, записываются в файл или передаются другой программе. Ввод в программу осуществляется из файлов или с клавиатуры.

В целом переадресация больше относится к функциям операционной системы, а не библиотек iosream. Язык C++ предоставляет доступ к четырем стандартным устройствам и необходимый набор команд для переадресации устройств ввода-вывода.

 

 

Вывод данных с помощью cin

 

Глобальный объект cin отвечает за ввод данных и становится доступным при включении в программу класса iostream. В предыдущих примерах используется перегруженный оператор ввода (> > ) для присвоения вводимых данных переменным программы. Для ввода данных используется следующий синтаксис".

int someVariable;

cout < < " Enter а number: ";

cin > > someVariable;

Другой глобальный объект, cout, и его использование для вывода данных обсуждается несколько ниже. Сейчас же остановимся на третьей строке: cin > > someVariable;. Что же представляет собой объект cin?

На глобальность этого объекта указывает тот факт, что его не нужно объявлять в коде программы. Объект cin включает перегруженный оператор ввода (> > ), который записывает данные, хранимые в буфере cin, в локальную переменную someVariable. Причем оператор ввода перегружен таким образом, что подходит для ввода данных всех базовых типов, включая int&, short&, long&, double&, float&, char&, char* и т.п. Когда компилятор встречает выражение cin > > someVariable, то вызывается вариант оператора ввода, соответствующий типу переменной someVariable. В приведенным выше примере someVariable имеет тип int, поэтому вызывается следующий вариант перегруженной функции:

istream & operator> > (int& )

Обратите внимание, поскольку параметр передается как ссылка, оператор ввода может изменять исходную переменную. Использование cin показано в листинге 16.1.

Листинг 16.1. Использование cin для ввода данных разных типов

1: //Листинг 16.1. Ввод даннах с помощью cin

2:

3: #include < iostream.h>

4:

5: int main()

6: {

7: int myInt;

8: long myLong;

9: double myDouble;

10: float myFloat;

11: unsigned int myUnsigned;

12:

13: cout < < " int: ";

14: cin > > myInt;

15: cout < < " Long: ";

16: cin > > myLong;

17: cout < < " Double: ";

18: cin > > myDouble;

19: cout < < " Float: ";

20: cin > > myFloat;

21: cout < < " Unsigned: ";

22: cin > > myUnsigned; 23:

24: cout < < " \n\nInt: \t" < < myInt < < endl;

25: cout < < " Long: \t" < < myLong < < endl;

26: cout < < " Double: \t" < < myDouble < < endl;

27: cout < < " Float: \t" < < myFloat < < endl;

28: cout < < " Unsigned: \t" < < myUnsigned < < endl;

29: return 0;

30: }

 

Результат:

int: 2

Long: 70000

Double: 987654321

Float: 3.33

Unsigned: 25

Int: 2

Long: 70000

Double: 9.87654e+08

Float: 3.33

Unsigned: 25

 

Анализ: В строках 7—11 объявляются переменные разных типов. В строках 13—22 пользователю предлагается ввести значения для этих переменных, после чего результаты выводятся в строках 24—28 (с помощью cin).

Выводимая программой информация говорит о том, что переменные записываются и выводятся в соответствии с их типом.

Строки

 

Объект cin также может принимать в качестве аргумента указатель на строку символов (char*), что позволяет создавать буфер символов и заполнять его с помощью cin. Например, можно написать следующее:

char YourName[50]

cout < < " Enter your name: ";

cin > > YourName;

Если ввести имя Jesse, переменная YourName заполнится символами J, e, s, s, e и \0. Последним будет концевой нулевой символ, так как cin автоматически вставляет его. Поэтому при определении размера буфера нужно позаботиться о том, чтобы он был достаточно большим и мог вместить все символы строки, включая концевой нулевой символ. Более подробно о поддержке концевого нулевого символа стандартными библиотечными строковыми функциями речь пойдет на занятии 21.

 

Проблемы, возникающие при вводе строк

 

Успешно выполнив все описанные ранее операции с объектом cin, вы будете неприятно удивлены, если попытаетесь ввести в строке полное имя. Дело в том, что cin рассматривает пробел как заданный по умолчанию разделитель строк. После того как в строке обнаруживается пробел, ввод строки завершается добавлением концевого нулевого символа. Эта проблема показана в листинге 16.2.

Листинг 16.2. Попытка ввода бодев одного сша с помощьм cin

1: //Листинг 16.2. Проблемы с вводом строки с помощью cin

2:

3: #include < iostream.h>

4:

5: int main()

6: {

7: char YourName[50];

8: cout < < " Your first name: ";

9: cin > > YourName;

10: cout < < " Here it is: " < < YourName < < endl;

11: cout < < " Your entire name: ";

12: cin > > YourName;

13: cout < < " Here it is: " < < YourName < < endl;

14: return 0;

15: }

 

Результат:

Your first name: Jesse

Here it is: Jesse

Your entire name: Jesse Liberty

Here it is: Jesse

 

Анализ: Строкой 7 для хранения вводимой пользователем строки создается массив символов. В строке 8 пользователю предлагается ввести имя, и, как видно из вывода, это имя сохраняется правильно.

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

Чтобы понять, почему cin работает именно так, проанализируйте листинг 16.3, в котором показан пример ввода строки значений.

Листинг 16.3. Ввод строки значений

1: //Листинг 16.3. Ввод строки значений с помощью cin

2:

3: #include < iostream.h>

4:

5: int main()

6: {

7: int myInt;

8: long myLong;

9: double myDouble;

10: float myFloat;

11: unsigned int myUnsigned;

12: char myWord[50];

13:

14: cout < < " int: ";

15: cin > > myInt;

16: cout < < " Long: ";

17: cin > > myLong;

18: cout < < " Double: ";

19: cin > > myDouble;

20: cout < < " Float: ";

21: cin > > myFloat;

22: cout < < " Word: ";

23: cin > > myWord;

24: cout < < " Unsigned: ";

25: cin > > myUnsigned;

26:

27: cout < < " \n\nInt: \t" < < myInt < < endl;

28: cout < < " Long: \t" < < myLong < < endl;

29: cout < < " Double: \t" < < myDouble < < endl;

30: cout < < " Float: \t" < < myFloat < < endl;

31: cout < < " Word: \t" < < myWord < < endl;

32: cout < < " Unsigned: \t" < < myUnsigned < < endl;

33:

34: cout < < " \n\nInt, Long, Double, Float, Word, Unsigned: ";

35: cin > > myInt > > myLong > > myDouble;

36: cin > > myFloat > > myWord > > myUnsigned;

37: cout < < " \n\nInt: \t" < < myInt < < endl;

38: cout < < " Long: \t" < < myLong < < endl;

39: cout < < " Double: \t" < < myDouble < < endl;

40: cout < < " Float: \t" < < myFloat < < endl;

41: cout < < " Word: \t" < < myWord < < endl;

42: cout < < " Unsigned: \t" < < myUnsigned < < endl;

43:

44:

45: return 0;

46: }

Результат:

Int: 2

Long: 30303

Double: 393939397834

Float: 3.33

Word: Hello

Unsigned: 85

Int: 2

Long: 30303

Double: 3.93939e+11

Float: 3.33

Word: Hello

Unsigned: 85

Int, Long. Double, Float, Word, Unsigned: 3 304938 393847473 6.66 bye -2

Int: 3

Long: 304938

Double: 3.93847e+08

Float: 6.66

Word: bye

Unsigned: 4294967294

Вновь в программе объявляются переменные разных типов и массив символов. Пользователю предлагается последовательно ввести данные разных типов, чтобы убедиться что программа поддерживает ввод данных любого типа.

Анализ: В строке 34 пользователю предлагается ввести все данные сразу в определенном порядке, после чего каждое введенное значение присваивается соответствующей переменной. Благодаря тому что cin рассматривает пробелы между словами как разделители, становится возможной инициализация всех переменных. В противном случае программа пыталась бы ввести всю строку в одну переменную, что было бы ошибкой.

Обратите внимание на строку 42, в которой выводится без знаковое целое число. Пользователь ввел значение -2. Поскольку программа была проинструктирована, что вводится без знаковое целое число, то вместо знакового -2 будет введено без знаковое двоичное представление этого числа. Поэтому при выводе с помощью cout на экране отображается значение 4294967294, являющееся двоичным представлением числа -2.

Позже вы узнаете, как вводить в буфер строки, содержащие несколько слов, разделенных пробелами. Сейчас же рассмотрим подробнее использование cin для ввода данных сразу в несколько переменных, как в строках 35-36.

 

Оператор > > возвращает ссылку на объект istream

 

Оператор > > возвращает ссылку на объект istream. Но поскольку cin сам является объектом istream, результат выполнения одной операции ввода может быть началом следующей операции ввода, как показано ниже:

Int Var0ne, varTwo, varThree;

cout < < " Enter three numbers: "

cin > > Var0ne > > varTwo > > varThree;

В строке cin > > VarOne > > varTwo > > varThree; сначала выполняется первый ввод cin > > VarOne, в результате чего возвращается объект istream, позволяющий выполнить присвоение второго значения переменной varTwo. Это равносильно следующей записи:

((cin > > VarOne) > > varTwo) > > varThree;

Аналогичный подход используется с объектом cout, но речь об этом пойдет дальше.

 

Другие методы объекта cin

 

В дополнение к перегружаемому оператору > > объект cin имеет множество других встроенных методов. Они используются в тех случаях, когда необходим более совершенный контроль над вводом данных.

Ввод одного символа

 

Вариант operator> >, принимающий ссылку на символ, может использоваться для считывания одного символа со стандартного устройства ввода. Для этого используется функция-член get(). При этом можно применять get() без параметров или использовать вариант этой же функции, принимающей в качестве параметра ссылку на символ.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 436; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.052 с.)
Главная | Случайная страница | Обратная связь